Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 域对象封装:静态方法与服务类_Design Patterns_Architecture_Domain Driven Design - Fatal编程技术网

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

Design patterns 域对象封装:静态方法与服务类,design-patterns,architecture,domain-driven-design,Design Patterns,Architecture,Domain Driven Design,我在DDD书籍(Eric Evans)中读到,需要在演示中使用的过程应该转移到服务类。例如,BankAccountManagementService具有ChangeBankAccount、GetByAccountId。。。方法 但是,我需要封装一些属性的setter,以禁止从其他业务对象分配它们。由于C#没有友好的类,因此在服务的情况下不可能使用这种类型的封装。但可以使用BankAccount业务对象的静态方法来实现 (1) 如果出于上述原因使用服务,您如何解决此限制 编辑:补充问题 (2) 为

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

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

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

编辑:补充问题

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


提前感谢:)

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

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

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

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


当方法是实例方法时,您可以利用多态性和泛型,创建泛型ServiceBase类并将常用方法放在那里。

感谢您的回答,但是为什么不使用静态方法而不是没有任何问题的服务?编辑回答以反映静态comment@Danil例如我举的例子是这样的。假设你有一个银行服务类。它有所有你需要的方法来操纵银行账户。如果您需要根据不同的国家采用不同的方法,会发生什么情况?方法名称可能相同,但其过程可能略有不同。这就是拥有不同实例的想法的理由。拥有两个或多个实例允许您交换服务,同时保留相同的占位符(通常是一个接口)。仅使用静态模式进行此操作是不切实际的。事实上,静态方法应该局限于实用程序类+请看我的评论。