Внедрение зависимостей с объектами NHibernate - PullRequest
8 голосов
/ 04 декабря 2008

Мне интересно, как указать NHibernate для разрешения зависимостей от моих объектов домена POCO.

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 04 декабря 2008

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

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

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 голос
/ 04 декабря 2008

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

1 голос
/ 04 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...