-1

编辑:为了清楚起见,这个问题与 DDD 有关,它有一个称为值对象的概念,这些不是值类型,它们是一种以内容构成身份的方式构建对象的方式,我试图理解这些概念应该应用多远(从评论看来它们不应该渗透到领域之外)。对于不熟悉 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
    }
}

我没有为用户名、密码、UseIntegratedSecurity 设置不同的参数,而是创建了一个值对象来保存它们。我的问题是,这个概念是否太过分了,我是否误解了点值对象的设计目的?

4

2 回答 2

2

在我看来很好。您将属于一起的项目分组为有凝聚力的单元,这有什么问题?

于 2012-10-15T12:54:10.490 回答
2

这取决于您的上下文。

  • 如果你定义SqlServerCredentials为一个实体,是的,你走得太远了:

“一个实体是一个对象,它不是由它的属性定义的,而是由一条连续性和它的身份定义的。”

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

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

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

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

总之,以 DDD 的方式,如果您不考虑SqlServerCredentials作为一个实体,那没关系。但这一切都与上下文有关。

于 2012-10-15T12:59:01.470 回答