Шаблон репозитория: один класс репозитория для каждого объекта?
Предположим, что у вас есть следующие сущности, определенные в классе LINQ:
Product
Customer
Category
Должен ли я иметь один класс репозитория для всех:
StoreRepository
... или мне нужно:
ProductRepository
CustomerRepository
CategoryRepository
Каковы преимущества и недостатки каждого? В моем случае у меня есть несколько "приложений" в моем решении... приложение Store является лишь одним из них.
Ответы
Ответ 1
Вот моя точка зрения. Я строго придерживаюсь шаблона репозитория. Должно быть 3 метода, которые принимают один объект. Добавить, Обновить, Удалить, в общем случае.
public interface IRepository<T>
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
}
Помимо этих методов вы имеете дело с методом "Запрос" или методом службы. Если бы я был вами, я бы сделал репозиторий, как это указано выше, добавьте "QueryProvider", как показано ниже, и поместите свою бизнес-логику там, где она принадлежит либо "Сервисы", либо "Команды/Запросы" (происходит от CQRS, Google).
public interface IQueryProvider<T>
{
TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}
(Надеюсь, мое мнение несколько полезно:))
Ответ 2
Все это зависит от того, как будет работать "Domain Driven Design". Знаете ли вы, что такое Агрегатный корень? Большую часть времени, когда в типичном порядке можно выполнить все ваши основные CRUD, будет достаточно. Его только тогда, когда вы начинаете иметь толстые модели с контекстом и границами, что это начинает иметь значение.
Ответ 3
В основном будет один репозиторий для каждого объекта-заполнителя. Есть несколько интересных моментов в отношении DDD
и агрегатного корневого объекта и как мы должны создавать классы репозитория в книге ASP.NET MVC 2 в действии, посмотрите на него, если хотите узнать больше.
Ответ 4
У меня бы был один репозиторий/объект, потому что неизменно должна быть карта из моего EntityTable для моего объекта домена (например, в теле GetIQueryableCollection(). Как мне удалось написать этот повторяющийся код создав шаблон T4 для его создания.
У меня есть пример проекта, который генерирует шаблон репозитория на codeplex http://t4tarantino.codeplex.com/ Пример панели инструментов T4 Шаблоны бизнес-классов и репозитория.
Он может работать не так, как вам хотелось бы, без какой-либо настройки, если вы уже не реализуете Tarintino и несколько других полезных свойств, но шаблоны легко настраивать.
using System;
using System.Collections.Generic;
using System.Linq;
using Cses.Core.Domain.Model;
using StructureMap;
namespace Cses.Core.Domain
{
/// <summary>
/// Core class for Schedule E
/// </summary>
public class ScheduleERepository : IScheduleERepository
{
private Cses.Core.Repository.SqlDataContext _context = new Cses.Core.Repository.SqlDataContext();
/// <summary>
/// constructor
/// </summary>
public ScheduleERepository() { }
/// <summary>
/// constructor for testing
/// </summary>
/// <param name="context"></param>
public ScheduleERepository(Cses.Core.Repository.SqlDataContext context)
{
_context = context;
}
/// <summary>
/// returns collection of scheduleE values
/// </summary>
/// <returns></returns>
public IQueryable<ScheduleE> GetIQueryableCollection()
{
return from entity in _context.ScheduleEs
select new ScheduleE()
{
Amount = entity.Amount,
NumberOfChildren = entity.NumberChildren,
EffectiveDate = entity.EffectiveDate,
MonthlyIncome = entity.MonthlyIncome,
ModifiedDate = entity.ModifiedDate,
ModifiedBy = entity.ModifiedBy,
Id = entity.Id
};
}