域对象封装:静态方法与服务类

时间:2011-01-26 10:16:52

标签: design-patterns architecture domain-driven-design

我读过DDD书(Eric Evans),需要在演示中使用的程序应该转移到服务类。例如,BankAccountManagementService具有ChangeBankAccount,GetByAccountId ......方法。

但是我需要封装一些属性的setter来禁止从其他业务对象中分配它们。由于C#没有友好的类,因此在服务的情况下不可能使用这种类型的封装。但是可以使用BankAccount业务对象的静态方法来完成它。

(1)如果出于上述原因使用服务,您如何解决此限制?

编辑:其他问题

(2)为什么使用静态方法代替服务是不好的?我可以将它们放在单独的部分类文件中,以便不将proc代码与实体代码混合。

提前致谢:)

1 个答案:

答案 0 :(得分:6)

如果不应设置域对象的属性(不可变),则将它们设为私有(或受保护)。

负责更改域对象的私有属性的服务方法将执行必要的验证和/或权限检查,并通过其构造函数(包括其id)创建一个新对象,其中包含要更改和保存的属性那个对象。

另一个选择是在您的域对象上放置一个set方法,该方法接受新值,以及某种权限对象,或者将该方法属性设置为需要某些权限。这样你就可以约束调用集合的位置。

编辑: 制作静态是一个建筑黑洞: 你不能继承他们或以任何方式改变他们。 它使得无法使用依赖注入。 版本控制更难;一旦你做了静态和使用,很难扭转这个决定。 此外,您的静态方法今天可能不使用实例数据,但将来可能需要它。

当方法是实例方法时,您可以使用多态和泛型,创建一个通用的ServiceBase类并在那里放置常用的方法。