Я создаю небольшой проект Recipe Organizer MVC с кодом EntityFramework сначала и выпуском Sql Server Compact, чтобы узнать больше о DDD и шаблоне репозитория.
Вот некоторые из моих доменных объектов, я упростил их для этого вопроса.
public class Recipe {
public int Id { get; set; }
[Required]
public string Name { get; set; }
/// <summary>
/// Represents a common meal type of “Breakfast, Lunch or Dinner”
/// or type of course “Appetisers, Soups, Salads, Fish, Poultry & Game, Meat, Side dishes, Desserts, Miscellaneous", etc.
/// (for scope I am not considering brunch or supper or any other type)
/// </summary>
[Required]
public Course Course { get; set; }
public virtual ICollection<Ingredient> Ingredients { get; set; }
}
public class Ingredient {
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
public class Course {
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
По моему мнению, для масштаба этого проекта я бы сказал, что Рецепт - это Совокупный Корень, а Ингредиент и Курс - это агрегаты Рецепта.
Если я возьму этот пример и использую шаблоны MVC, чтобы дать мне пример реализации шаблона репозитория, я получу приведенный ниже интерфейс и класс EFRecipeRepository, который реализует интерфейс и имеет ссылку на контекст БД EF.
public interface IRecipeRepository
{
IQueryable<Recipe> All { get; }
IQueryable<Recipe> AllIncluding(params Expression<Func<Recipe, object>>[] includeProperties);
Recipe Find(int id);
void InsertOrUpdate(Recipe recipe);
void Delete(int id);
void Save();
}
Следуя этому руководству:
В контексте шаблона репозитория совокупные корни — это единственные объекты, которые ваш клиентский код загружает из репозитория.
Репозиторий инкапсулирует доступ к дочерним объектам — с точки зрения вызывающей стороны он автоматически загружает их либо одновременно с загрузкой корня, либо тогда, когда они действительно необходимы (как при ленивой загрузке).
Я бы хотел добавить больше в этот интерфейс, чтобы получить ингредиент или курс через рецепт.
Моя проблема заключается в том, что я хочу добавить некоторые функции в свои представления, которые включают только ингредиенты или курс, например: навигацию по всем различным типам курсов (а не только те, которые связаны с рецептами) и список автозаполнения. для ингредиентов.
В рамках моего проекта ингредиенты не существуют вне рецепта, поэтому представляется целесообразным, чтобы он был совокупностью рецептов. Однако кажется, что это должен быть сам совокупный корень, потому что он существует сам по себе?
Я изо всех сил пытаюсь понять, как все это должно работать, если бы я хотел получить список всех ингредиентов, означало бы это, что мне сначала пришлось бы использовать хранилище рецептов, чтобы загрузить все рецепты, чтобы найти все ингредиенты ?
У курса аналогичная проблема, за исключением того, что он используется как путь к категориям рецептов и поэтому может существовать и за пределами этой границы.
Есть ли какая-то концепция, которую я упускаю? возможно, способ создать службу, которая используется для таких требований к уровню представления? Есть ли у кого-нибудь мнение о том, как это должно быть сделано? или какие-нибудь лучшие предложения? Спасибо
Кстати, это небольшой проект, и DDD может быть не лучшим подходом, но я считаю, что шаблон репозитория очень полезен для игнорирования персистентности в моей модели предметной области.
Спасибо