我想知道如何告诉NHibernate解决对我的POCO域对象的依赖。
我发现像CalculateOrderTax这样的方法应该在Domain对象中,因为它们会编码特定于域的业务规则。但是,一旦我有两个违反SRP的话。
将这些方法提取到Strategy类是没有问题的,但我想知道如何让NHibernate加载它们。
在将对象移交给更高层之前,循环访问存储库中的对象列表以进行基于依赖注入的依赖注入似乎不是一个好的解决方案。
我现在也在使用Castle Windsor作为我的Depency注射剂。
答案 0 :(得分: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 :(得分:1)
由于目前没有人能够回答您的问题,我认为我建议重组您的代码,以免需要订单来计算自己的税。
你可以将它委托给一个OrderTaxService,它接受一个Order对象并返回一个OrderValue对象或类似的东西。
这将保留您域中的逻辑,但无需将其附加到Order对象。
答案 2 :(得分:1)
我同意Garry的观点,即您应该尽可能地从域对象中删除服务依赖项。有时它是有意义的,例如加密/解密。在这种情况下,您可以使用拦截或IUserType将其隐藏在基础结构中。我认为当你可以使用后者时,后者是有利的。 This article详细说明了如何操作。我这样做,它的工作非常好。