2

我刚刚开始使用域驱动设计,并且有一个针对我的域的项目,其结构如下:

领域

  • /实体
  • /边界
  • /用户故事

据我了解 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 class Message
{        
        private string _text;

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

        internal Message()
        {

        }

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

1 回答 1

2

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

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

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

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

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

于 2012-11-18T12:59:47.287 回答