2010-07-28 87 views
3

我有一个域模型类型。其众多属性之一需要ITranslationService提供将其返回值转换为适当语言的能力。依赖注入域模型的技巧

我是否应该将ITranslationService注入到域模型类型的构造函数中(因此必须随处更改类型实例化,并且在通过NhIbernate检索时必须关注初始化),即使它被类型(许多属性之一);还是有另一种功能模式可以使用?

有没有人有任何相关经验可以分享?

+0

检查http://techblog.bozho.net/?p=180 – Bozho 2010-07-28 11:05:51

回答

0

我应该注入 ITranslationService到 构造域模型类型

是的,那可能是有意义的,根据您的情况。如果你总是避免将服务注入实体,那么这可能导致anemic domain model这是一种反模式。

需要实例化实体的代码可以通过使用工厂来屏蔽额外的构造函数参数,该工厂负责依赖注入。

的NHibernate也可以通过构造函数中注入服务的实体:http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html

+0

谢谢。最后我删除了依赖关系cf Tomas,但我喜欢你的工厂讨论。 – Ben 2010-07-28 11:53:13

4

我不希望域对象执行翻译 - 而是使用带有域对象(或相关属性值)的翻译服务作为参数,并返回翻译后的值。例如,你可以简单地做

var translatedString = yourServiceInstance.Translate(theDomainObject.Property); 
+0

+1这是更好的。另一种设计听起来像是违反了SRP。 – 2010-07-28 11:14:58

+0

我对你答案的理解是,你将翻译服务的依赖关系转移到方法的客户端上?您的代码看起来完全像属性中的代码。我的问题是提供依赖。一种可能性可能是将翻译服务注入新的访问方法。将访问器/增变器方法对暴露为nhibernate属性是否直截了当? ......我觉得我的深度不够 – Ben 2010-07-28 11:25:41

+0

@Ben:是的,将依赖项移动到使用域对象的对象,而不是在对象本身中。如果这是一个ASP.NET MVC Web应用程序,我可以将上面的代码想象成控制器操作或视图。这样做的目标是让你的域对象只保存数据,而其他人负责处理这些数据。 – 2010-07-28 11:38:25