design-patterns - 域对象封装 : static methods vs Service classes

标签 design-patterns architecture domain-driven-design

我在 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/

相关文章:

design-patterns - 贫血领域模型与领域模型

domain-driven-design - 聚合、事务一致性和 Entity Framework DbContext

ruby - 设计 Ruby API 中的类与模块?

java - 如果我将单例类用于数据库连接,一个用户可以为所有人关闭连接吗?

java - 听众是一个很好的解决方案吗?它们是如何实现的?

Java 架构 3 层对象设计

c++ - 服务的静态和动态演化

design-patterns - 简单领域驱动设计中的贫血领域模型与领域模型

C++:简单的任务,多次调用析构函数

domain-driven-design - 如何更新聚合内的实体