域驱动设计 - 域实体的访问修饰符

时间:2012-11-18 12:22:17

标签: domain-driven-design entities

我刚刚开始使用域驱动设计,并为我的域创建了一个项目,其结构如下:

  • /实体
  • /边界
  • / UserStories

据我了解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
        }
 }

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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