【问题标题】:Dependency injection with NHibernate objects使用 NHibernate 对象进行依赖注入
【发布时间】:2008-12-04 12:41:34
【问题描述】:

我想知道如何告诉 NHibernate 解决对我的 POCO 域对象的依赖关系。

我发现CalculateOrderTax 之类的方法应该在Domain 对象中,因为它们对特定于域的业务规则进行编码。但是一旦我有两个,我就违反了 SRP。

将这些方法提取到 Strategy 类中没有问题,但我想知道如何让 NHibernate 加载这些方法。

在将对象移交给更高层之前,循环遍历存储库中的对象列表以执行基于 get/set 的依赖注入似乎不是一个好的解决方案。

我现在也在使用 Castle Windsor 进行依赖注入。

【问题讨论】:

    标签: nhibernate dependency-injection


    【解决方案1】:

    我一直在使用拦截器来完成类似的任务:

    修改加载实体的拦截器:

    public class MyInterceptor : EmptyInterceptor
    {
        public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
        {
            return InjectDependencies(entity as MyEntity);
        }
    }
    

    将其与会话关联:

    nhSessionFactory.OpenSession(myInterceptor);
    

    我还在某处读到,在即将发布的 2.1 版本中会更好地支持自定义构造函数注入,但我现在似乎找不到参考。

    【讨论】:

    • Fabio(现任首席程序员)在这里解释了新的构造函数注入:fabiomaulo.blogspot.com/2008/11/…
    • 这也是我要做的。你能证明使用 OnLoad 事件而不是 Instantiate 是合理的吗?
    • 似乎 Instantiate 是一种创建自己的工厂的方法(如果您想使用构造函数注入,这可能会非常好)。我只需要将服务注入到可覆盖的基类中。
    【解决方案2】:

    由于目前似乎没有人能够回答您的问题,我想我建议您重组您的代码,以消除订单计算自己的税款的需要。

    您可以将它委托给 OrderTaxService,它接受一个 Order 对象并返回一个 OrderValue 对象或类似的东西。

    这会将逻辑保留在您的域中,但无需将其附加到您的 Order 对象。

    【讨论】:

    • 我现在就是这样做的。我一直在传递订单,让外部类计算东西。感觉不对,因为我的对象 a) 是可变的,b) 我需要一直携带这些服务,因为如果我不想从业务逻辑代码中更新它们。
    • 当一件事有多种策略时,它会变得更加棘手。像具有 normalTaxrate 的订单的计算方式与其他订单不同。然后我必须让服务决定如何计算给定域对象的税款。 ..
    【解决方案3】:

    我同意 Garry 的观点,即您应该尽可能地从域对象中删除服务依赖项。有时它是有意义的,例如加密/解密。在这种情况下,您可以使用拦截或 IUserType 将其隐藏在基础结构中。我认为后者在您可以使用时是有利的。 This article 详细展示了如何做到这一点。我正在这样做,效果很好。

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 1970-01-01
      • 2015-09-26
      • 2014-01-19
      • 2014-03-25
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多