集計の設計方法に問題があります。
、、およびエンティティがCompany
あります。これらはそれぞれ、独自の集約の集約ルートである必要があります。、およびエンティティはシステム全体で使用され、他の多くのエンティティから参照されるため、値オブジェクトではなく、さまざまなシナリオでアクセスする必要があります。したがって、リポジトリが必要です。Aには、、、、、、などのメソッドがあります。City
Province
Country
City
Province
Country
CityRepository
FindById(int)
GetAll()
GetByProvince(Province)
GetByCountry(Country)
GetByName(string)
次の例を見てください。エンティティは、 に属する にCompany
関連付けられています。City
Province
Country
ここで、いくつかの企業とその都市、州、および国を一覧表示する企業一覧ページがあるとします。
IDによる参照
エンティティがCity
、Province
またはを参照する必要がある場合はCountry
、ID で行います (Vaughn Vernon の提案による)。
リポジトリからこのデータを取得するには、4 つの異なるリポジトリを呼び出してから、データを照合してビューに入力する必要があります。
var companies = CompanyRepository.GetBySomeCriteria();
var cities = CityRepository.GetByIds(companies.Select(x => x.CityId);
var provinces = ProvinceRepository.GetByIds(cities.Select(x => x.ProvinceId);
var countries = CountryRepository.GetByIds(province.Select(x => x.CountryId);
foreach(var company in companies)
{
var city = cities.Single(x => x.CityId == company.CityId);
var province = provinces.Single(x => x.ProvinceId == city.ProvinceId);
var country = countries.Single(x => x.CountryId == province.CountryId);
someViewModel = new CompanyLineViewModel(company.Name, city.Name, province.Name, country.Name);
}
これは非常にかさばり、非効率的ですが、明らかに「正しい」方法ですか?
参照による参照
エンティティが参照によって参照された場合、同じクエリは次のようになります。
var companies = CompanyRepository.GetBySomeCriteria();
someViewModel = new CompanyLineViewModel(company.Name, company.City.Name, company.Province.Name, company.Country.Name);
しかし、私が理解している限り、これらのエンティティは異なる集計に存在するため、参照によって参照することはできません。
質問
これらの集計をより適切に設計するには、他にどのような方法がありますか?
異なる集計に存在する場合でも、都市モデルを使用して会社エンティティを読み込むことはできますか? これはすぐに集計間の境界を壊すと思います。また、集計を更新する際にトランザクションの一貫性を処理する際にも混乱が生じます。