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 {
- /实体
- /界限
- /用户故事
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:同意。一般来说,我尝试尽可能多地封装,但域位于核心,意味着由外层调用。当然,也不是说不在程序集外部使用的类不应该是内部的。