我可以在NHibernate中替换对Activator.CreateInstance()的调用吗?

时间:2009-04-15 17:12:58

标签: nhibernate structuremap

有没有办法替换对NHibernate 2.0.1GA内部使用的Activator.CreateInstance()的调用来构造实体?理想情况下,我想用StructureMap.ObjectFactory.GetInstance()替换它。

3 个答案:

答案 0 :(得分:4)

使用构造函数注入无法轻松完成此操作。 NHibernate内部可能需要创建一个继承自域类的代理对象,其中包含Lazy加载代码等,因此,据我所知,没有简单的选项可以覆盖对象的构造。

可以通过NHibernate轻松地使用NHibernate,通过编写一个拦截器,通过属性setter注入为你构建对象。有一个例子here。这个例子是使用Windsor作为DI容器,但你可以使用StructureMap做同样的事情 - here are the relevant docs for StructureMap - 查找“将Setter注入应用于现有对象(BuildUp)”一节。

警告:在您的域模型中注入依赖项通常被视为设计问题的症状,许多人都避免这样做,所以在开始编码之前,请确保这是您想要做的事情!

答案 1 :(得分:2)

看看this post from Fabio Maulo(现在的NHibernate领导开发者),几个月前他解决了这个问题。该代码适用于NHibernate 2.1,但我认为可以通过删除IProxyFactoryFactory部分将其移植到2.0.1GA。

答案 2 :(得分:1)

你可以通过实现IInterceptor并使用Objectfactory.BuildUp在onload方法中进行注入来进行setterinjetion。这很容易实现,setter注入可能不是你想要的。

您可以通过实现自己的IBytecodeProvider和ReflectionOptimizer来进行构造函数注入。这有点难,但有可能!

我不建议在实体中注入东西。在99.9%的情况下,这将导致糟糕的设计,并使您的设计不可能分层。也许你面对0.01%的情况,这是正确的事情。这与你输入goto语句一样频繁。