有没有办法替换 NHibernate 2.0.1GA 中使用的对 Activator.CreateInstance() 的调用来构造实体?理想情况下,我想用 StructureMap.ObjectFactory.GetInstance() 替换它。
3 回答
使用构造函数注入不能轻易做到这一点。NHibernate 内部可能需要创建一个从您的域类继承的代理对象,并在其中散布延迟加载代码等,因此,据我所知,没有简单的选项可以覆盖您的对象的构造。
但是,您可以通过编写一个拦截器来相当容易地使用 NHibernate 进行依赖注入,该拦截器将通过属性设置器注入为您构建对象。这里有一个例子。该示例使用 Windsor 作为 DI 容器,但您当然可以使用 StructureMap 做同样的事情 -这里是 StructureMap 的相关文档- 查找“将 Setter 注入应用到现有对象(BuildUp)”部分。
警告:将依赖项注入域模型通常被视为设计问题的征兆,许多人避免这样做,因此在开始编码之前确保这确实是您想要做的!
看看Fabio Maulo(现任 NHibernate 首席开发人员)的这篇文章,他在几个月前解决了这个问题。该代码适用于 NHibernate 2.1,但我认为可以通过删除 IProxyFactoryFactory 部分将其反向移植到 2.0.1GA。
您可以通过实现 IInterceptor 并使用 Objectfactory.BuildUp 在 onload 方法中进行注入来进行 setterinjetion。这很容易实现,setter 注入可能不是你想要的。
您可以通过实现自己的 IBytecodeProvider 和 ReflectionOptimizer 来进行构造函数注入。这有点难做,但有可能!
我不建议在实体中注入东西。在 99.9% 的情况下,这将导致糟糕的设计并使您的设计中的分层变得不可能。也许您面临 0.01% 的情况,认为这是正确的做法。这是你经常做的事情,就像输入 goto 语句一样。