假设您在LINQ类中定义了以下实体:
Product
Customer
Category
我应该为所有人设置一个存储库类:
StoreRepository
......或者我应该:
ProductRepository
CustomerRepository
CategoryRepository
什么是职业选手每个人的利弊?就我而言,我的解决方案中有几个“应用程序”......商店应用程序只是其中之一。
答案 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
};
}