У меня проблема с проектированием агрегатов.
У меня есть сущности Company
, City
, Province
и Country
. Каждый из них должен быть совокупным корнем своего собственного агрегата. Сущности City
, Province
и Country
используются во всей системе и на них ссылаются многие другие сущности, поэтому они не являются объектами значений и к ним также необходимо обращаться во многих различных сценариях. Значит, у них должны быть репозитории. CityRepository
будет иметь такие методы, как FindById(int)
, GetAll()
, GetByProvince(Province)
, GetByCountry(Country)
, GetByName(string)
.
Возьмем следующий пример. Сущность Company
связана с City
, который принадлежит Province
, который принадлежит Country
:
Теперь предположим, что у нас есть страница со списком компаний, на которой перечислены некоторые компании с указанием их города, провинции и страны.
Справка по ID
Если объекту нужно ссылаться на City
, Province
или Country
, они будут делать это по идентификатору (как было предложено Воном Верноном).
Чтобы получить эти данные из репозиториев, нам нужно вызвать 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);
Но, насколько я понимаю, на эти сущности нельзя ссылаться, поскольку они существуют в разных агрегатах.
Вопрос
Как еще я мог бы лучше спроектировать эти агрегаты?
Могу ли я загрузить объекты компании с помощью модели города, даже если они существуют в разных агрегатах? Я полагаю, что это скоро сломает границы между агрегатами. Это также создало бы путаницу при работе с согласованностью транзакций при обновлении агрегатов.