рассмотрит следующий пример: упрощенногоDDD - Объект переход состояния
public class Ticket
{
public int Id;
public TicketState State;
public Ticket()
{
// from where do I get the "New" state entity here? with its id and name
State = State.New;
}
public void Finished()
{
// from where do I get the "Finished" state entity here? with its id and name
State = State.Finished;
}
}
public class TicketState
{
public int Id;
public string Name;
}
состояние класса используется непосредственно в билете объекта домена. Позже в жизненном цикле билета могут быть установлены другие состояния.
Билет сохраняется в таблице билетов, а также в TicketState. Таким образом, в БД билет будет иметь внешний ключ в таблице состояния билета.
При настройке подходящего состояния внутри моего объекта, как загрузить экземпляр состояния из БД? Нужно ли мне вводить репозиторий в объект? Нужно ли использовать такой фреймворк, как замок для такого случая? Или есть лучшие решения, может быть, переход извне?
public class Ticket
{
//...
public ITicketStateRepository stateRep; //<-- inject
public Ticket()
{
State = stateRep.GetById(NEW_STATE_ID);
}
//...
}
Есть ли передовая практика? До сих пор я не использовал рамки инъекции зависимостей или что-нибудь и все любые сохраняемости вещи из моего домена ..
другой Approch:
public class Ticket
{
//...
public Ticket(NewTicketState newTicketState)
{
State = newTicketState;
}
public void Finished(FinishedTicketState finishedTicketState)
{
State = finishedTicketState;
}
//...
}
+1 для настойчивости неосведомленных объектов. Просто потому, что модель домена была загрязнена объектами репозитория, не означает, что она не анемия - на самом деле она может скрыть места, где объекты домена несут свой вес. –
Спасибо, но, возможно, мой вопрос был недостаточно ясным. Я спрашивал, как установить подходящую государственную сущность, когда, например, билет инициируется или изменяется его состояние. Можете ли вы опубликовать пример о том, как решить эту проблему? – Chris
Состояние экземпляра достаточно просто: оно должно быть NEW. Что-то должно организовывать события, чтобы изменить свое состояние. Обычно я называю это услугой, потому что он реализует конкретный прецедент. Он будет владеть экземпляром репозитория, который он будет использовать для создания нового билета или чтения существующего, изменения его состояния для удовлетворения прецедента, сохранения нового состояния как отдельной единицы работы и прекращения использования дело. – duffymo