Domain driven design 域驱动设计-域实体的访问修改器

Domain driven design 域驱动设计-域实体的访问修改器,domain-driven-design,entities,Domain Driven Design,Entities,我刚开始进行领域驱动设计,我的领域有一个项目,其结构如下: 领域 /实体 /界限 /用户故事 正如我所理解的DDD,除了外部世界与域通信的边界之外,域中的一切都应该是不可见的。我所看到的域内实体类的所有示例都有一个公共访问修改器,例如,这里有一个名为Message的实体: public class Message { private string _text; public string Text {

我刚开始进行领域驱动设计,我的领域有一个项目,其结构如下:

领域

  • /实体
  • /界限
  • /用户故事
正如我所理解的DDD,除了外部世界与域通信的边界之外,域中的一切都应该是不可见的。我所看到的域内实体类的所有示例都有一个公共访问修改器,例如,这里有一个名为Message的实体:

public class Message
{        
        private string _text;

        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        public Message()
        {

        }

        public bool IsValid()
        {
           // Do some validation on text
        }
}
如果实体类及其成员被标记为internal,这样它就只能在域项目中访问,这不是更正确吗

例如:

internal class Message
{        
        private string _text;

        internal string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        internal Message()
        {

        }

        internal bool IsValid()
        {
           // Do some validation on text
        }
 }

我认为这里有一个混淆:有界上下文是一个概念,它定义了一个模型有效的上下文,在这个上下文中没有实际命名为边界的类。也许这些是用于反腐败目的的对象,但实际上聚合根应该在有界上下文中处理该对象或某个入口点

我不会像这样构造一个域,这是人为的,你应该根据现实世界中有意义的过程来构造域。您使用DDD在代码中对真实世界的流程进行建模,除了实体或值对象之外,我没有听到软件开发人员以外的任何人谈论AOD。他们谈论订单、产品、价格等

顺便说一句,该消息几乎肯定是一个值对象,除非域确实需要唯一地标识每条消息。这里的消息是一个域概念,我希望你不是指命令或事件。您应该将验证放在构造函数中,或者放在给定新值的方法中

公平地说,这段代码是simplistc的一种方式,也许您选择了错误的示例。关于类是内部的还是公共的,它们可能是一个或另一个。这不是一个规则,它取决于很多事情。在一个极端情况下,几乎每个对象都是内部对象,但实现了应用程序的公共接口,这可能是非常低效的


经验法则:如果类在域程序集之外使用,则将其公开,如果它是域内部使用的东西和/或实现了公共接口,则将其公开。

我认为您是对的,这可能是错误的示例,我可能将DDD与实体控件边界模式混为一谈。谢谢你的经验法则,对我帮助很大。@MikeSW:同意。一般来说,我尝试尽可能多地封装,但域位于核心,意味着由外层调用。当然,也不是说不在程序集外部使用的类不应该是内部的。