DDD模式下父聚合根中子对象的封装与创建权限控制方案咨询
DDD模式下父聚合根中子对象的封装与创建权限控制方案咨询
我正在用DDD的方式实现两个类——一个父类和一个子类,核心需求是只能通过父类来创建新的子类实例。
我的初步思路是:把父类中添加子类的AddChild方法设为public,但想把子类的创建方法Create设为internal,以此避免绕过父类直接创建子类。
目前我的代码实现如下:
public class MyParent { public long Id { get; private set; } string Name { get; private set; } // other properties public Child AddChild(Child paramChildWithDataToCreateChild) { Child.Create(paramChildWithDataToCreateChild); } } internal class Child { internal long Id { get; private set; } internal string Name { get; private set; } // other properties internal Child Create(Child paramChild) { // Code to create the child } }
但这里遇到了两难的问题:
- 如果把父类的
AddChild设为internal,其他程序集就无法创建子类了,不符合业务使用需求; - 如果把
Child类设为public,其他程序集又能直接创建子类实例,违背了我想通过父类管控子类创建的初衷。
我还想到另一种可能:把Child类设为public,但把Create方法设为internal——这样其他程序集不能直接创建子类,必须通过父类的方法。不过我有点纠结:其他程序集能直接访问Child类,从DDD的封装角度来看,这是不是一个合适的设计呢?
总的来说,我希望尽可能地封装父聚合根,有没有更合理的实现方案?谢谢!
备注:内容来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

