我在 DDD 书(埃里克埃文斯)中读到,需要在演示中使用的过程应移至服务类。例如 BankAccountManagementService 有 ChangeBankAccount、GetByAccountId ... 方法。
但是我需要封装一些属性的 setter 来禁止从其他业务对象分配它们。由于 C# 没有友好的类,因此不可能在服务的情况下使用这种类型的封装。但是可以使用 BankAccount 业务对象的静态方法来完成。
(1) 因上述原因使用服务时如何解决此限制?
编辑:附加问题
(2) 为什么用静态方法而不是服务不好?我可以将它们放在单独的部分类文件中,以免将 proc 代码与实体代码混合。
提前致谢:)
最佳答案
如果不应设置域对象的属性(不可变),则将它们设为私有(private)(或 protected )。
负责更改域对象的私有(private)属性的服务方法将执行必要的验证和/或权限检查,并通过其构造函数之一(包括其 id)创建一个新对象,其中包含要更改和保存的属性那个对象。
另一种选择是在您的域对象上放置一个设置方法,该方法采用新值和某种权限对象,或者将方法属性化为需要某些特权。这样您就可以限制调用集的位置。
编辑: 使事物静止是一个架构黑洞: 您不能继承它们或以任何方式更改它们。 这使得无法使用依赖注入(inject)。 版本控制更难;一旦您将 then 设置为 static 并使用了,就很难撤销该决定。 此外,您的静态方法今天可能不使用实例数据,但将来可能需要。
当方法是实例方法时,您可以利用多态性和泛型,创建一个通用的 ServiceBase 类并将常用的方法放在那里。
关于design-patterns - 域对象封装 : static methods vs Service classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4803378/