У меня есть структура объекта следующим образом:
IManager: IDeletable
{
IEnumerable<IFund> Funds {get;}
IFailureNotification Delete();
}
IFund : IDeletable
{
IEnumerable<IFundClass> FundClasses
IFailureNotification Delete();
}
IFundClass: IDeletable, IInvestable
{
IFailureNotification Delete();
}
И у меня есть служба, которая берет IDeletable
и вызывает на ней команду Delete.В зависимости от возвращаемого значения он либо фиксирует транзакцию, либо откатывает ее обратно.Я использую NHibernate для сохранения классов, поэтому не могу поместить RI в БД и поймать исключение (что мне бы не понравилось в любом случае).
Это классический случай полиморфизма и Manager
перебирает свои Funds
и удаляет их перед удалением, Fund
в свою очередь удаляет FundClass
es перед удалением, поэтому служба может просто взять любую сущность, реализующую IDeletable
, и знать, что удаление выполнитдействия на всех уровнях.
Вот проблема: классы фондов должны определить, используются ли они в совершенно отдельном контексте, используя интерфейс IInvestable
, о котором они ничего не знают.Для этого требуется служба - IInvestmentCalculationService
.
Очевидно, я не хочу вставлять InvestmentCalculationService
в конструктор сущностей класса фондов, и я не хочу вставлять его в метод удаления, так как этов фондах и менеджерах, а также во многих других классах, так что не имеет никакого смысла - это также означает, что, как только у нас появятся дополнительные требования, мы должны изменить методы удаления для всего.
Я немного искушенпо модели «События домена» здесь: http://www.udidahan.com/2009/06/14/domain-events-salvation/ но я не уверен, что это правильно, так как я пытаюсь получить данные обратно из обработчика сработавших событий - который будет работать, но пахнет немного неправильно, и всепримеры показывают только огонь и забывают ситуации.
У кого-нибудь есть предложения?