我的数据库中有几个产品表:

  • ProductTypes
  • 产品类别
  • ProductCategoryItems
  • ProductInventory

我现在看到它的方式,我可以制作具有以下方法的IProduct:

  • FindAllTypes()
  • FindAllCategories(int typeId)
  • FindAllItems(int categoryId)

或者,我可以分别模仿表结构:IProductType,IProductCategory等。

是否有理由与另一个一起去?

===============>>#1 票数:13 已采纳

存储库的想法是委托每个人负责一个实体。 在这种情况下,建议为每个实体建立一个存储库。 您也可以使用大型存储库,但这不是最佳解决方案。 最后,你会得到一个有很多方法的巨大课程,而且非常紧密。 也难以维修。

===============>>#2 票数:6

我认为拥有一个巨大的存储库并不是一个好主意,那么你基本上就拥有一个可以完成所有事情的数据访问神类。

我喜欢有一个基本的Repository<T>来执行常见的操作,比如GetByIdGetAll 我通常都有我的所有存储库继承这个基类来获得免费的常用方法,所以我不必继续重写相同的代码。

===============>>#3 票数:4

在我看来,它在很大程度上取决于业务领域模型,确定您的主要业务实体是非常重要的。 数据库中的每个表都不一定直接映射到业务实体。 表只是关系数据库的规范化方式的一个或多个实体的表示。

尝试描绘您的域模型超出规范化关系数据库的限制,是否真的有多个业务概念? 存储库应围绕固体,整体,一流的业务实体构建。

我的建议是拥有一个IProductRepository,其中包含实现CRUD操作的必要方法,并根据需要进行扩展。 您不希望得到过于雄心勃勃的界面,因为您可能不需要大部分界面,这可能是一种负担。 接口的重要之处在于将代码与持久性模式分离,因此后者可以灵活地在它们之间进行切换。

也许在未来,业务将需要演变为更详细的表示 - 例如 - 产品的提供商,在那一刻,您将使用您的良好判断来决定代表一个值得专用存储库的重要业务实体或者不。

希望这可以帮助。

===============>>#4 票数:3

我不同意其他人(编辑:除了艾萨克)。 小型存储库是一个外观(不是模式)。

如果实体类型是耦合的(彼此具有导航属性),那么它们实际上是不可分离的。

修改一个实体类型并提交更改可能会将更改提交给其他实体。

此外,您无法在同一工作单元上创建任何小型存储库,因为ORM只有有限数量的实体映射到数据库。

将您的模型划分为可分离的域,并为每个域创建一个特定的工作单元。

在这些工作单元上,为您可能需要立即访问的每个实体类型创建聚合根

每个根应该具有特定类型的add,remove,getbykeys,query等方法。

工作单元应该具有commit更改和相似的方法。

每个根类似于其他提到的小型存储库,但是,工作单元是真正的中型存储库(其模型可能有多种类型)。

例:

// Create one of these
interface IUnitOfWork
{
    void Commit();
}

// Create one of these
interface IEntitySet<TEntity> where TEntity : class
{
    void Add(TEntity entity);
    void Remove(TEntity entity);
    TEntity Create<TSpecificEntity>() where TSpecificEntity : TEntity;

    IQueryable<TEntity> Query();
}

// Create one of these per entity type
interace IEntitySetOfTEntity1 : IEntitySet<Entity1>
{
    TEntity1 GetByKeys(int key1);
}

interace IEntitySetOfTEntity2 : IEntitySet<Entity2>
{
    TEntity1 GetByKeys(short key1, short key2);
}

// Create one of these per separatable domain
interface IDomain1UnitOfWork : IUnitOfWork
{
    IEntitySetOfTEntity1 Entity1s
    {
        get;
    }

    IEntitySetOfTEntity2 Entity2s
    {
        get;
    }
}

所有这些接口及其实现都可以自动生成。

这些接口及其实现的重量非常轻,绝不是其中任何一个“具有大量方法的巨大类”。 由于它们可以自动生成,因此维护很容易。

通过使用以下命令,可以将特定功能添加到接口IDomain1UnitOfWork,IEntitySetOfTEntity1等等:
一个。 扩展方法
部分接口和类(不太推荐,因为这会导致DAL不太干净)

如果使用扩展方法将GetByKeys()方法添加到IEntitySet <Entity1>,则可以忽略IEntitySetOfTEntity1之类的接口。

  ask by Mike translate from so

未解决问题?本站智能推荐:

2回复

每个项目或每个模块一个DLL?

我曾经使用3层项目来解决方案(某些解决方案有3个以上的项目)。 其中大多数是ASP.Net MVC解决方案,因此其中许多具有以下项目:站点,业务和数据。 因此,将创建3个DLL,对吗? 这些天来,我想知道我的业务层应该只是一个DLL还是应该为该业务层中的每个模块创建一个DLL,例如Pr
2回复

ASP MVC应用程序的存储库模式设计

这更像是一个设计问题。 我正在建立一个应用程序,我已经创建了我的存储库模式结构如下: 我的核心名称空间是DAL / Repository / BusinessLogic层组件。 顺便说一下,我使用Dapper.NET micro ORM作为我的数据连接,这就是为什么你会在我的S
2回复

在MVC控制器中具有存储库引用

我正在使用MVC,Nhibernate和IOC容器进行企业应用程序。 我三层: DAL - Nhibernate数据存储库 BLL - 业务层 演示 - MVC控制器 我正在使用IOC容器来注册工作单元和CustomerRepository对象。 国际奥委会
3回复

排序,按存储库模式分页和松散耦合

我有一个SalesmanRepository ,它只列出数据库中的所有推销员。 我想在网格中显示结果(想象一个Web界面),以便用户可以显示或隐藏任何字段,对列进行排序并使用分页。 假设我有一个很大的集合,那么排序和分页必须在服务器端。 我的问题是,如何在架构中保持松散耦合?
2回复

验证检查在存储库模式中的位置?

假设我有一个名为User的实体,它有许多帖子。 我的服务看起来像这样删除帖子: 我的验证码在哪里? (确保用户有权删除)。 我应该在1个数据库调用的存储库中执行此操作吗? 或者我应该在我进行2次调用的服务层中进行检查: 通过userId获取用户。 在对用户进行验
1回复

构建CMS类型应用程序时,两个站点或一个站点

我正在构建一个主要包含文章的网站,并且正在使用ASP.NET MVC 5框架。 我想要一个管理页面,可以在其中添加,编辑这些文章内容。 我正在建立一个同时进行内容管理(添加文章)和显示内容(显示文章)的网站。 这种方法有什么缺点吗? (我必须建立一个用于内容管理的站点,另一个站点
1回复

在服务器上处理的小API调用与在内存中存储的一个大数据拉取

设计问题:我有一个SPA Angular 7应用程序,并且有相当数量的数据需要处理来自用户的每个输入以变成图形。 例如:如果用户打开1月份,则图表仅显示Janruary的数据...然后,如果用户打开1月和2月,则图表会再次更新。 用户还可以关闭和打开其他过滤器。 实现此功能的最佳方法是什么
7回复

在存储库模式的抽象类上使用接口的优势? [重复]

可能重复: 接口与基类 通常可以看到使用Interfaces实现的存储库模式 但你可以使用抽象类同样地做到这一点。 在存储库方案中使用Interface over Abstract Class有哪些具体优势? (即不要只是告诉我你可以实现多个接口,我已经知道
1回复

Master-Detail视图与ORM,工作单元和存储库模式相结合

我不确定如何最好地结合ORM实现主详细视图。 该应用程序将WPF与MVVM一起使用,并显示所有可用对象的网格以及当前所选对象的详细信息。 视图的ViewModel非常简单,它具有: 一个ObservableCollection<ItemViewModel> Item
4回复

存储和使用动态属性

所以,我正在研究电子商务应用程序,我的客户希望能够创建类别和产品......显然。 现在,假设客户将拥有大约100个类别和20,000个产品。 客户端需要能够创建对过滤有意义的类别属性....因此,类别硬盘驱动器可能具有以下属性: 容量 RPM包 构成因素