存储库模式:每个实体的一个存储库类?

时间:2010-08-19 17:48:47

标签: asp.net-mvc linq linq-to-sql repository-pattern

假设您在LINQ类中定义了以下实体:

Product
Customer
Category

我应该为所有人设置一个存储库类:

StoreRepository

......或者我应该:

ProductRepository
CustomerRepository
CategoryRepository

什么是职业选手每个人的利弊?就我而言,我的解决方案中有几个“应用程序”......商店应用程序只是其中之一。

4 个答案:

答案 0 :(得分:18)

这是我的观点。我是Repository模式的严格追随者。应该有3种方法采用单个实体。添加,更新,删除,一般定义。

public interface IRepository<T>
{
     void Add(T entity);
     void Update(T entity);
     void Delete(T entity);
}

除了这些方法之外,您还在处理“查询”或服务方法。如果我是你,我会按照上面的流程定义存储库,如下所示添加“QueryProvider”,并在“服务”或“服务”中添加将业务逻辑放在中命令/查询“(来自CQRS,谷歌)

public interface IQueryProvider<T>
{
     TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}

(希望我的意见有点有用:))

答案 1 :(得分:5)

这完全取决于你将如何“领域驱动设计”。你知道聚合根是什么吗?大多数情况下,一般打字可以做你所有的基本CRUD就足够了。它只有当你开始拥有带有上下文和边界的厚模型时才开始变得重要。

答案 2 :(得分:1)

每个聚合根对象基本上会有一个存储库。关于DDD和聚合根对象以及如何在书ASP.NET MVC 2 in Action中设计存储库类有一些有趣的观点,如果你想了解更多,请查看它。

答案 3 :(得分:0)

我有一个存储库/对象,因为总是需要从我的EntityTable到我的域对象的映射(例如在GetIQueryableCollection()的主体中。我如何编写这个重复的代码是通过制作T4模板为我生成它。

我有一个示例项目,它在codeplex上生成存储库模式http://t4tarantino.codeplex.com/ T4 Toolbox示例业务类和存储库模板。 除非你已经实现了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                          
               };           
        }