2008-12-04 3 views
8

Мне интересно, как сообщить NHibernate о разрешении зависимостей с моими объектами домена POCO.Включение зависимостей с объектами NHibernate

Я понял, что такие методы, как CalculateOrderTax, должны быть в объекте Domain, потому что они кодируют бизнес-правила домена. Но как только у меня есть два из них, я нарушаю SRP.

Было бы нецелесообразно извлекать эти методы для классов стратегии, но мне интересно, как заставить их загрузить NHibernate.

Это не похоже на хорошее решение для прокрутки списка объектов в репозитории, чтобы получить/установить на основе Dependecy инъекции, прежде чем передавать объект на более высокие уровни.

Я также использую Castle Windsor для моей инъекции Depency прямо сейчас.

ответ

8

Я использую перехватчик для подобных задач:

перехватчика, который изменяет загруженные объекты:

public class MyInterceptor : EmptyInterceptor 
{ 
    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
     return InjectDependencies(entity as MyEntity); 
    } 
} 

ассоциирует его с сессией:

nhSessionFactory.OpenSession(myInterceptor); 

Я также читать где-то там была бы лучшая поддержка для пользовательской инъекции конструктора в предстоящей версии 2.1, но я не могу найти ссылку прямо сейчас.

1

Поскольку никто, кажется, не может ответить на ваш вопрос, в тот момент, когда я думал, что предлагаю реструктурировать ваш код, чтобы удалить требование для расчета собственного налога.

Вы можете делегировать его службе OrderTaxService, которая берет объект Order и возвращает объект OrderValue или что-то в этом роде.

Это сохранит логику в вашем домене, но удалит необходимость прикрепить ее к объектам Order.

+0

Вот как я делаю это прямо сейчас. Я передаю заказ все время и позволяю внешним классам вычислять вещи. Это просто неправильно, потому что мои объекты: а) изменчивые и б) мне нужно постоянно носить с собой эти Службы, потому что, если я не хочу их обновлять из кода бизнес-логики. – Tigraine 2008-12-04 15:08:39

+0

Это становится сложнее, когда есть несколько стратегий для одной вещи. Как и Заказы с normalTaxrate, рассчитываются иначе, чем другие. Затем я должен позволить службам решать, как рассчитать налоги для данного объекта домена. .. – Tigraine 2008-12-04 15:09:43

1

Я согласен с Garry в том, что вы должны как можно больше удалять службы зависимостей от объектов домена. Иногда это имеет смысл, например, шифрование/дешифрование. В этом случае вы можете скрыть его в инфраструктуре с помощью перехвата или IUserType. Я думаю, что последнее благоприятно, когда вы можете его использовать. This article подробно показывает, как это сделать. Я делаю это, и он работает нормально.