2008-12-04 96 views
8

我想知道如何告诉NHibernate解决依赖我的POCO域对象。依赖注入与NHibernate对象

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

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

它似乎不是一个好的解决方案,通过循环库中的对象列表来执行基于get/set的Dependecy注入,然后将对象移交给更高层。

我现在也在为我的Depency注射剂使用Castle Windsor。

回答

8

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

修饰加载实体拦截器:

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版本中会有更好的支持自定义构造函数注入的地方,但我似乎无法找到现在的参考。

1

由于目前似乎没有人能够回答您的问题,因此我认为我会建议您重新构建您的代码,以免除订单需要计算它自己的税款。

您可以将它委托给一个OrderTaxService,它接收一个Order对象并返回一个OrderValue对象或沿着这些行的东西。

这将保留您的域中的逻辑,但不需要将它附加到您的Order对象。

+0

这就是我现在要做的。我一直传递命令,让外部类来计算东西。它只是感觉不对,因为我的对象是a)可变的,b)我需要随身携带这些服务,因为如果我不想从业务逻辑代码中提出这些服务的话。 – Tigraine 2008-12-04 15:08:39

+0

当一件事情有多种策略时,它会变得更加棘手。与正常税率的订单一样,其计算方式与其他方式不同。然后,我必须让服务部门决定如何计算给定域对象的税收。 .. – Tigraine 2008-12-04 15:09:43

1

我同意Garry的看法,您应该尽可能地从您的域对象中删除服务依赖项。有时候它是有道理的,比如加密/解密。在这种情况下,您可以使用拦截或IUserType将其隐藏在基础结构中。我认为后者是有利的,当你可以使用它。 This article详细显示了如何做到这一点。我正在做这个,它工作得很好。