-1

編集:明確にするために、この質問は、値オブジェクトと呼ばれる概念を持つDDDに関連しています。これらは値型ではなく、コンテンツがIDを構成するようにオブジェクトを構築する方法です。私は理解しようとしていました。これらの概念をどこまで適用する必要があるか(コメントから、ドメイン外に浸透してはならないようです)。この質問は、DDDに精通していない人には奇妙に見えるかもしれませんが、明確にするために、値型を作成するのではなく、オブジェクトを作成するための非常に特殊なメカニズムに関するものです。

2つの値オブジェクトを持つ次のサンプルコードについて考えてみます。

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に個別のパラメーターを設定するのではなく、それらを保持するための値オブジェクトを作成しました。私の質問は、これは概念を行き過ぎているのでしょうか、オブジェクトが設計されているポイント値を誤解していませんか?

4

2 に答える 2

2

は、私にはよく見えますよ。一緒に属するアイテムをまとまりのあるユニットにグループ化しますが、それについて何が間違っている可能性がありますか?

于 2012-10-15T12:54:10.490 に答える
2

それはあなたの文脈に依存します。

  • エンティティとして定義する場合SqlServerCredentials、はい、行き過ぎです:

「エンティティは、その属性ではなく、継続性のスレッドとそのアイデンティティによって定義されるオブジェクトです。」

  • 値オブジェクトとして定義する場合SqlServerCredentials、あなたは正しいです(それは不変でなければならないことを忘れないでください!):

「値オブジェクトは、属性を含むが概念的なアイデンティティを持たないオブジェクトです。それらは不変として扱われる必要があります。」

  • SqlServerCredentials集合体として定義する場合、あなたも正しいです:

nアグリゲートは、ルートエンティティ(アグリゲートルートとも呼ばれます)によって結合されたオブジェクトのコレクションです。アグリゲートルートは、外部オブジェクトがそのメンバーへの参照を保持することを禁止することにより、アグリゲート内で行われる変更の一貫性を保証します。

SqlServerCredentials結論として、DDDの方法で、エンティティとして検討していない場合は問題ありません。しかし、それはすべてコンテキストに関するものです。

于 2012-10-15T12:59:01.470 に答える