代码之家  ›  专栏  ›  技术社区  ›  Jeff Mc

我可以在nhibernate中替换对activator.createInstance()的调用吗?

  •  1
  • Jeff Mc  · 技术社区  · 17 年前

    是否有方法替换在nhibernate 2.0.1ga中用于构造实体的Activator.CreateInstance()调用?理想情况下,我想用structuremap.objectfactory.getInstance()替换它。

    3 回复  |  直到 17 年前
        1
  •  4
  •   Steve Willcock    17 年前

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

    可以 但是,通过编写一个拦截器,通过属性设置器注入为您构建对象,可以很容易地使依赖项注入与nhibernate一起工作。有一个这样的例子 here .该示例使用windsor作为DI容器,但是您当然可以对structuremap执行相同的操作。- here are the relevant docs for StructureMap -请参阅“将setter注入应用于现有对象(构建)”部分。

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

        2
  •  2
  •   Mauricio Scheffer    17 年前

    看一看 this post from Fabio Maulo (现在的NHibernate领导开发),几个月前他解决了这个问题。代码是针对NHibernate 2.1的,但我认为它可以通过移除iProxyFactoryFactory的部件而被重新移植到2.0.1ga。

        3
  •  1
  •   Paco    17 年前

    您可以通过实现iInterceptor和使用ObjectFactory.Buildup在OnLoad方法中执行注入来执行settingJetion。这很容易实现,setter注入可能不是您想要的。

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

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