3

Companyアプリケーションでは、エンティティおよびAddress値オブジェクトとしてモデル化しました。

public class Company : Entity  {
    public Address PrimaryAddress { get; set; }
    public Address SecondaryAddress { get; set; }
}

public class Address : ValueObject {
    public string ZipCode { get; private set; } // etc.

    public Address(string zipCode) {
        ZipCode = zipCode;
    }
}

ここでAddressは、ID を持たず、不変です。会社の を更新するには、新しいオブジェクトPrimaryAddressに置き換えます。Address

しかし、ドメインをさらに詳しく調べたところ、ある企業のアドレスの数はさまざまであることがわかりました。それらを個々のプロパティとして表すことは、もはや実現不可能でした。そこで、リファクタリングしましたCompany:

public class Company : Entity  {
    public Address[] AddressBook { get; set; }
}

現在、会社の をどのように更新するかという問題がありますAddress。アドレスの IDを気にするようになりましたが、これは Company のコンテキスト内でのみです。

リファクタリング後、最終的には次のようになります。

public class Company : Entity  {
    public Address[] AddressBook { get; set; }

    public void UpdateAddress(Address newAddress) {
        var oldAddress = AddressBook.FirstOrDefault(a => a.Id == newAddress.Id);
        if (oldAddress != null)
            oldAddress = newAddress;
    }
}

public class Address : ValueObject {
    public Guid Id { get; private set; }
    public string ZipCode { get; private set; } // etc. 

    public Address(Guid id, string zipCode) {
        ZipCode = zipCode;
        Id = id;
    }
}

// usage
var company = repo.Load<Company>(companyId);
var address = new Address(model.Id, "12345"); // uses id of address we are replacing

company.UpdateAddress(address);
repo.Save(company);

アドレスを更新するには、そのアドレスを使用して検索し、同じIDIdを持つ新しいアドレス オブジェクトに置き換えます。

  • したがって、Address はまだ値オブジェクトですか?
  • 更新された Address に同じIdを使用するのは正しいのでしょうか、それとも定義上 (値オブジェクトとして) Id を置き換える必要があるのでしょうか。
  • Address が Company エンティティのコンテキスト内でのみ ID を持つ場合、これをモデルで明示し、おそらくエンティティ内でのみ一意の ID を生成する必要があります (計算の一部としてエンティティの ID を使用する可能性があります)。
4

1 に答える 1

5

したがって、Address はまだ値オブジェクトですか?

いいえ、Address に ID を与えるとすぐに、それは値オブジェクトではなくなります。これは、その属性だけを気にするのをやめて、アプリケーションの Address ライフサイクルを重視し始め、その状態の変化を追跡することなどを意味します。

更新された Address に同じ Id を使用するのは正しいのでしょうか、それとも定義により (値オブジェクトとして) Id を置き換える必要があるのでしょうか。

アドレス ID を再利用しません。ドメインの観点から見ると、会社が移転した場合、それ自体が変わるのはアドレスではありません。その住所には有効な番地と建物が引き続き存在します。その ID によって定義された住所にはまだ現実性があり、別の会社で再利用することも想像できます。したがって、会社が移転した場合、新しい ID を持つ新しい Address を指すように変更する必要があるのは、Company と Address の間の関連付けだけです。

Address が Company エンティティのコンテキスト内でのみ ID を持つ場合、モデルでこれを明示し、おそらくエンティティ内でのみ一意の ID を生成する必要があります (計算の一部としてエンティティの ID を使用する可能性があります)。

Company 内のさまざまなアドレスを特定する必要があると感じたからといって、それらに Id を与えて値オブジェクトではなくエンティティにする必要があるというわけではありません。たとえば、Company 内の住所をランク付けしたい場合、プライマリ Address を定義するなど、値オブジェクトを使用して完全に行うことができます。アドレス値オブジェクトは同じままで、Company 内のインデックス付きコレクション、PrimaryAddress フィールドなどを持つことができます。

于 2012-04-12T11:44:52.033 に答える