3

この単純なクラスがあるとします

public class MyEntity
{
    public DateTime DateUpdated { get; private set; }
    public string Author { get; private set; }
    public string Comment { get; private set; }

    public void AddComment(string comment, string author)
    {
        Author = author;
        Comment = comment;
        DateUpdated = DateTime.Now;
    }
}

セッターをプライベートにしてクラスをカプセル化し、AddComment メソッドを追加してクラスにいくつかの動作を追加しました。これは、新しいオブジェクトを作成するときに完全に正常に機能しますが、データベースからエンティティをロードする場合、DateUpdated はもちろん避けたい現在の日付に設定されます。

DateUpdated セッターを公開しないようにするために使用できるパターンはありますか? クラスはもちろん、より一般的な問題の単なる例です。

より多くのパブリック コンストラクターを作成せずに、私が今得た最も近いものは、パブリック 静的メソッドを介してアクセスするプライベート コンストラクターを作成することです。

4

5 に答える 5

4

オブジェクトのフィールドに一致するパラメーターを受け取るコンストラクターを使用します。

これにより、起動時にオブジェクトを設定し、不変に保つことができます。

public MyEntity(DateTime dateUpdated, string author, string comment)
{
  DateUpdated = dateUpdated;
  Author = author;
  Comment = comment;
}
于 2012-08-03T13:10:33.837 に答える
3

オブジェクトを再水和するための Memento パターンを調べます。コンストラクターは、新しいインスタンスを作成する場合にのみ使用してください。

于 2012-08-20T20:12:31.597 に答える
1

NHibernateなどのORMを使用してリポジトリを実装している場合、プロパティがプライベートセットであっても、データベースのデータに基づいてプロパティに値が割り当てられます。つまり、AddCommentメソッドをバイパスしてデータを直接注入します。これは、エンティティを再構成するときに動作が繰り返されず、データのみをコピーする必要があるため、理にかなっています。NHibernateでは、エンティティに保護されたパラメーターなしのコンストラクターが含まれている必要があります。独自のORM実装を使用している場合は、Odedが提案するコンストラクターパターンを使用できます。その場合、エンティティは永続性を無視したままになる可能性があるためです。

于 2012-08-09T00:22:32.490 に答える
1

次のように AddComment メソッドをオーバーロードできます。

public class MyEntity
{
    public DateTime DateUpdated { get; private set; }
    public string Author { get; private set; }
    public string Comment { get; private set; }

    public void AddComment(string comment, string author)
    {
        Author = author;
        Comment = comment;
        DateUpdated = DateTime.Now;
    }

    public void AddComment(string comment, string author, DateTime dateUpdated)
    {
        Author = author;
        Comment = comment;
        DateUpdated = dateUpdated;
    }
}
于 2012-08-03T13:24:16.113 に答える
0

これらのオブジェクトの作成を担当するリポジトリが同じアセンブリ内にある場合は、内部アクセス修飾子を確認する必要があります。これがプロジェクトのニーズに合う場合は、次の 2 つの方法のいずれかで実装できます...

  1. セッターを からprivateに変更しますinternal。作成者は、インスタンス化後にプロパティの値を設定するだけです。
  2. internalすべてのプロパティの値を受け入れて設定するコンストラクタを追加します。

どちらの方法でも、例で示したように、パブリック メソッドを使用して変更を許可できます。

于 2012-08-03T17:11:30.947 に答える