【问题标题】:Domain objects encapsulation: static methods vs Service classes领域对象封装:静态方法与服务类
【发布时间】:2011-08-05 07:01:39
【问题描述】:

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

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

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

编辑:附加问题

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

提前致谢:)

【问题讨论】:

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


    【解决方案1】:

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

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

    另一种选择是在您的域对象上放置一个 set 方法,该方法采用新值和某种权限对象,或者将该方法赋予需要某些权限。这样您就可以限制调用集合的位置。

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

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

    【讨论】:

    • 感谢您的回答,但是为什么不使用静态方法代替服务没有任何问题呢?
    • 编辑答案以反映静态评论
    • @Danil:给我的例子是这个。假设您有一个 BankService 类。它具有操作银行帐户所需的所有方法。如果根据国家/地区需要不同的方法,会发生什么?方法名称可能相同,但它们的过程可能略有不同。这就是拥有不同实例的想法证明自己的地方。拥有两个或更多实例允许您在保持相同占位符(通常是接口)的同时交换服务。仅使用静态执行此操作是不切实际的。事实上,静态方法应该仅限于实用程序类。
    • 同意詹姆斯的观点。为评论 +1。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2010-10-01
    • 1970-01-01
    • 2018-10-20
    • 2018-02-06
    相关资源
    最近更新 更多