我是否过分接受了价值物品(DDD)

时间:2012-10-15 12:45:11

标签: c# domain-driven-design

编辑: 为清楚起见,这个问题与DDD有关,DDD有一个名为Value Objects的概念,它们不是Value Types,它们是一种以内容构成身份的方式构建对象的方式,我试图了解多远这些概念应该适用(从评论看来,它们似乎不应该在域外看到)。对于不熟悉DDD的人来说,这个问题可能看起来很奇怪,但要明确它是关于创建不创建值类型的对象的非常具体的机制。

考虑以下示例代码,它有两个值对象:

public class SqlServerConnectionSettings
{
    public string DatabaseName { get; set; }

    public string ServerName { get; set; }

    public SqlServerCredentials Credentials { get; private set; }

    public SqlServerConnectionSettings(SqlServerCredentials credentials)
    {
        Credentials = credentials;
    }

    public string AsConnectionString()
    {
        //Snip
    }
}

public class SqlServerCredentials
{
    public string Username { get; private set; }

    public string Password { get; private set; }

    public bool UseIntegratedSecurity { get; private set; }

    public SqlServerCredentials(string username = "", string password = "", bool useIntegratedSecurity = true)
    {
        Username = username;
        Password = password;
        UseIntegratedSecurity = useIntegratedSecurity;
    }

    public string AsConnectionStringCredentials()
    {
       //Snip
    }
}

我没有为Username,Password,UseIntegratedSecurity设置明确的参数,而是创建了一个值对象来保存它们。我的问题是,这是否过于概念,我是否误解了对象设计的点值?

2 个答案:

答案 0 :(得分:2)

对我来说很好看。您将属于一起的项目分组为具有凝聚力的单元,这可能是错误的吗?

答案 1 :(得分:2)

这取决于你的背景。

  • 如果您将SqlServerCredentials定义为实体,是的,那么您走得太远了:
  

"实体是一个不是由其属性定义的对象,而是一个连续性及其身份的线程。"

  • 如果您将SqlServerCredentials定义为值对象,那么您是对的(不要忘记它应该不可变!):
  

"值对象是包含属性但没有概念标识的对象。它们应该被视为不可变的。"

  • 如果您将SqlServerCredentials定义为聚合,那么您也是对的:
  

聚合是由根实体绑定在一起的对象的集合,也称为聚合根。聚合根通过禁止外部对象保持对其成员的引用来保证聚合内所做更改的一致性。

总之,以DDD方式,如果您不将SqlServerCredentials视为实体,那就没问题。但这完全取决于背景。