В настоящее время я разрабатываю проект в MVC 3. Я разделил свои проблемы, поэтому есть такие проекты, как ядро, репозиторий, пользовательский интерфейс, службы и т. д. Я реализовал репозиторий, UnitOfWork и, самое главное, шаблон состояния.
Я использую Entity Framework 4.3 для сохранения своих данных, и я столкнулся с довольно раздражающей ситуацией, связанной с сохранением текущего состояния. Ниже приведены некоторые примеры классов:
public class Request
{
public int RequestId { get; set; }
public State CurrentState { get; set; }
}
public abstract class State
{
[Key]
public string Name {get; set;}
public virtual void OpenRequest(Request request)
{}
public virtual void CloseRequest(Request request)
{}
}
public class RequestIsOpenState : State
{
public RequestIsOpenState()
{
this.Name = "Open";
}
public override void CloseRequest(Request request)
{
request.CurrentState = new RequstIsClosedState();
}
}
public class RequestIsClosedState : State
{
public RequestIsClosedState()
{
this.Name = "Closed";
}
public override void OpenRequest(Request request)
{
request.CurrentState = new RequstIsOpenState();
}
}
Используя приведенный выше пример, я получу исключение нарушения первичного ключа, потому что оно попытается создать НОВОЕ состояние в таблице состояний.
Поскольку изменение состояния выполняется на уровне домена, я не могу просто «получить» состояние из репозитория и установить его с помощью внешнего ключа, выполнив что-то вроде этого:
Request request = unitOfWork.RequestRepository.Find(1);
request.CurrentState = unitOfWork.StateRepository.Find("Closed");
Я знаю, что у меня есть возможность не отображать свойство состояния и сохранять строковое свойство в классе запроса, а затем преобразовывать их туда и обратно через фабрику при получении и установке, когда объект гидратируется (см. этот ответ).
Все, что я хочу сделать, это сохранить класс состояния, поэтому, когда запрос возвращается, я могу немедленно получить доступ к методам состояния, не имея множества материалов EF, загрязняющих мой доменный уровень, просто для решения одной проблемы сохранения. Еще одним преимуществом этого было бы то, что это дает мне дополнительный бонус в виде таблицы в SQL для запросов к известным состояниям.
Request
(т. е. большая таблица с несколькими записями для каждогоRequest
— по одной для каждого состоянияRequest
прошел)? - person flipchart   schedule 24.02.2014Request
, или вам нужна таблицаRequestState
, содержащая идентификаторRequest
и значение состояния? - person flipchart   schedule 24.02.2014