Могу ли я заменить вызов Activator.CreateInstance () в NHibernate? - PullRequest
1 голос
/ 15 апреля 2009

Есть ли способ заменить вызов Activator.CreateInstance (), используемый внутри NHibernate 2.0.1GA для создания объектов? В идеале я хотел бы заменить его на StructureMap.ObjectFactory.GetInstance ().

Ответы [ 3 ]

4 голосов
/ 15 апреля 2009

Вы не можете сделать это легко с помощью инжектора конструктора. Внутренним элементам NHibernate, возможно, потребуется создать прокси-объект, унаследованный от вашего класса домена, с добавленным в него Lazy-загрузочным кодом и т. Д., Так что, насколько я знаю, нет простого варианта переопределить конструкцию вашего объекта.

Вы можете получить инъекцию зависимостей, работающую с NHibernate довольно легко, хотя, написав перехватчик, который создаст объект для вас посредством внедрения сеттера свойств. Вот пример этого здесь . В этом примере используется Windsor в качестве контейнера DI, но вы, конечно же, можете сделать то же самое с StructureMap - здесь приведены соответствующие документы для StructureMap - обратитесь к разделу «Применение метода Setter Injection к существующему объекту ( СКОПИВШИЙСЯ)».

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

2 голосов
/ 16 апреля 2009

Взгляните на этот пост от Фабио Мауло (нынешний ведущий разработчик NHibernate), он решил это несколько месяцев назад. Код для NHibernate 2.1, но я думаю, что его можно перенести на 2.0.1GA, удалив части IProxyFactoryFactory.

1 голос
/ 15 апреля 2009

Вы можете выполнить setterinjetion, внедрив IInterceptor и выполнив инъекцию в методе onload с Objectfactory.BuildUp. Это легко реализовать, инъекция сеттера может быть не тем, что вам нужно.

Вы можете сделать инжекцию в конструктор, реализовав свой собственный IBytecodeProvider и ReflectionOptimizer. Это немного сложнее, но это возможно!

Я не рекомендую вводить вещи в сущности. В 99,9% случаев это приведет к плохому дизайну и сделает наложение в вашем дизайне невозможным. Возможно, вы сталкиваетесь с 0,01% случаев, когда это правильно. Это то, что вы делаете так же часто, как набираете операторы goto.

...