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

Dan*_*nil 2 architecture design-patterns domain-driven-design

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

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

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

编辑:其他问题

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

提前致谢 :)

Tim*_*imC 6

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

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

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

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

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

  • @Danil:我得到的例子就是这个.想象一下,你有一个BankService类.它具有操纵银行账户所需的所有方法.如果您根据国家/地区需要不同的方法会发生什么?方法名称可以相同,但它们的过程可能略有不同.这就是让不同实例证明自己的理由.拥有两个或更多实例允许您在保持相同占位符(通常是接口)的同时交换服务.仅使用静态执行此操作是不切实际的.实际上,静态方法应该仅限于实用程序类. (2认同)