NHibernate и IoC IIинтерцептор - PullRequest
       17

NHibernate и IoC IIинтерцептор

2 голосов
/ 15 февраля 2011

Я пытался реализовать решение, подобное тому, что Айенде публикует в своей статье MSDN, Создание настольного приложения для работы с NHibernate . К счастью, Скулетц написал аналогичную статью, в которой рассказывает о том, чего я пытаюсь достичь, с помощью его 3-дневного сообщения в блоге о фокусах перехватчика NHibernate ( 1 , 2 , 3 ). У меня возникают проблемы с вызовом NHibernate параметризованного конструктора моего объекта POCO при создании экземпляра объекта.

Когда я удаляю защищенный конструктор без параметров, NHibernate жалуется с InvalidProxyTypeException: «Следующие типы не могут использоваться в качестве прокси: YourNamespace.YourClass: type должен иметь видимый (открытый или защищенный) конструктор без аргументов ". Если я добавлю защищенный конструктор по умолчанию, NHibernate больше не будет жаловаться, но зависимость (в перегруженном конструкторе) никогда не вызывается, вызывая приложение чтобы исключить NullReferenceException во время выполнения, когда зависимость не удовлетворена.

public MyClass
{
    IRequiredDependency dependency;

    public MyClass(IRequiredDependency dependency)
    {
        this.dependency = dependency;
    }

    protected MyClass() {}
}

Я просто не могу заставить NHibernate вызывать перегруженный конструктор. Есть мысли?

1 Ответ

3 голосов
/ 15 февраля 2011

В конфигурации контейнера IoC вы должны объявить свой тип с зависимостью в дополнение к самой зависимости.

        container.RegisterType<IRequiredDependency, RequiredDependency>();
        container.RegisterType<MyClass, MyClass>();

Я пропустил этот небольшой отрывок из сообщения Пабло (где он регистрирует класс Invoice в дополнение к его зависимости, IInvoiceTotalCalculator), поскольку я использую Unity вместо Windsor.

Еще одно замечание: Я обнаружил, что если вы хотите иметь какие-либо другие перегруженные конструкторы, сделайте их внутренними, оставьте конструктор по умолчанию защищенным и используйте только один общедоступный конструктор, содержащий ваши зависимости. Этот небольшой кусочек помог мне улучшить дизайн API для классов.

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