我刚刚开始使用域驱动设计,并为我的域创建了一个项目,其结构如下:
域
据我了解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
}
}
答案 0 :(得分:2)
我认为这里存在一个混淆:有界上下文是一个概念,它定义了模型有效的上下文,没有实际上名为Boundary的类。也许那些是反腐败目的的对象,但实际上Aggregate Root应该处理有界上下文中的那个或一些入口点。
我不会像这样构建一个域,这是人为的,你应该根据现实世界过程中有意义的结构来构建域。您正在使用DDD来模拟代码中的真实世界流程,而且我没有听到任何人在软件开发之外谈论实体或价值对象。他们谈论订单,产品,价格等
Btw认为Message几乎肯定是一个值对象,除非Domain确实需要唯一地标识每个Message。这里的消息是一个域概念,我希望你不是指一个命令或一个事件。您应该将验证放在构造函数或给出新值的方法中。
公平地说,这段代码是简化的方法,也许你选择了错误的例子。关于内部或公共的类,它们可能是一个或另一个不是一个规则,它取决于许多事情。在一个极端,你将拥有几乎每个对象都是内部的方法,但实现了应用程序常见的公共接口,这可能是非常低效的。
一个经验法则:如果在域程序集之外使用该类使其公开,如果它是域内部使用的内容和/或实现公共接口,则将其设置为内部。