Подтвердить что ты не робот

Шаблон репозитория: один класс репозитория для каждого объекта?

Предположим, что у вас есть следующие сущности, определенные в классе LINQ:

Product
Customer
Category

Должен ли я иметь один класс репозитория для всех:

StoreRepository

... или мне нужно:

ProductRepository
CustomerRepository
CategoryRepository

Каковы преимущества и недостатки каждого? В моем случае у меня есть несколько "приложений" в моем решении... приложение Store является лишь одним из них.

4b9b3361

Ответ 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                          
               };           
        }