2012-11-18 77 views
1

我刚开始学习领域驱动设计,并有我的域名一个项目,该项目的结构是这样的:领域驱动设计 - 访问修饰符域实体

  • /实体
  • /边界
  • /UserStories

据我所知DDD,除了边界与外界沟通的领域,该领域的一切都应该是无形的。所有的我都域内看到实体类的实例有一个公共接入改性剂,对于这里的例子,我有一个实体名为消息:

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 
     } 
} 

回答

2

我认为这里有一个困惑:在限界上下文是定义,其中模型是有效的有没有类actualy命名边界上下文的概念。也许这些是反腐目的的对象,但真正的聚合根应该处理有界上下文中的那个或某些入口点。

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

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

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

拇指规则:如果该类在域程序集外部使用,使其成为公共的,如果它是由域内部使用的某个内容和/或实现公共接口,则使其成为内部。

+0

我认为你是对的,这可能是错误的例子,我可能混合DDD与实体控制边界模式。感谢你的经验法则,帮助我很多。 –

+0

@MikeSW:同意。一般来说,我尽可能地封装,但是这个域是核心,并且是由外层调用的。当然,不要说在程序集外部不使用的类不应该是内部的。 – eulerfx