Совокупные корни и репозитории

В настоящее время я пытаюсь понять идею агрегированных корней и их связи с репозиториями.

Даны следующие объекты домена:

public class Country {

    public string Name { get; set; }
    public ICollection<City> Cities { get; set; }

}

public class City {

    public string Name { get; set; }

}

Думаю, я правильно определил Country как совокупный корень для City, так как в моем домене не должно быть городов, которые не расположены в пределах страна. Должна быть возможность добавить новый город в хранилище данных только через страну, и если страна будет удалена, каждый город внутри также должен быть удален.

Итак, как может выглядеть такой страновой репозиторий? И как выглядит Совокупный корень страны? Есть ли внутри домена CityRepository (что позволило бы мне добавить город в базу данных, даже если нет родственной страны!)? И есть ли CountryRepository внутри Country (каким-то образом стране нужно заполнить свои города? Или это работа репозитория?)


person Acrotygma    schedule 09.05.2014    source источник


Ответы (2)


Я думаю, у вас есть навык этого. В вашем случае, когда вы описываете:

так как в моем домене не должно быть городов, которые не находятся внутри страны. Должна быть возможность добавить новый город в хранилище данных только через страну, и если страна будет удалена, каждый город внутри также должен быть удален.

Вы правы, страна - это совокупный корень. Код вашей страны является общим корнем, и это правильно! Вам не нужен городской репозиторий. Ваш репозиторий страны на самом деле не меняется в зависимости от связанных объектов значений (в данном случае городов) или сущностей, поэтому в этом случае ваш базовый crud API будет выглядеть так:

public class CountryRepo {
    public Country GetCountry(String name);
    public Country SaveCourntry(Country country);
    public void DeleteCourntry(Country country);
    ...etc...
}

Чтобы коснуться вашего последнего вопроса:

И есть ли CountryRepository внутри Country (каким-то образом стране нужно заселить свои города? Или это работа репозитория?)

Ваш репозиторий позаботится об активности (обработке ваших сущностей). Заселение городов будет выполняться в сущности путем поддержания коллекции. Вы можете создать метод для своего объекта Country, чтобы добавить город:

public void AddCity(City city)
{
    this.Cities.Add(city);
}

remove будет аналогичен, тогда вы используете свое репо, чтобы сохранить страну, которая должна позаботиться о сохранении связанной коллекции городов.

person pragmatical    schedule 09.05.2014

Выбор совокупного корня основывается не только на иерархическом отношении данных. Если ваше приложение может обращаться к City напрямую и выполнять операции с City без использования Country (за исключением, конечно, операций добавления и удаления, которые вы упомянули), то Country не является совокупным корнем для City.

person Mike Stockdale    schedule 09.05.2014