C# 每个表一个存储库还是每个功能部分一个存储库?

C# 每个表一个存储库还是每个功能部分一个存储库?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在使用ASP.NET MVC 2和C#以及Entity Framework 4.0对标准化的SQL Server数据库进行编码。我的数据库结构的一部分包含一个包含外键的条目表,外键与包含驾驶员、汽车、发动机、底盘等的子表相关 我遵循书呆子晚餐教程,它为晚餐建立了一个足够公平的存储库。我是为司机、引擎、汽车等做一个,还是为参赛者做一个大的 这类工作的最佳实践是什么?我对这种编码方法还是个新手。我想这方面没有单一的“最佳实践”——这取决于您的编码风格和应用程序的要求。您完全可以为系统中的每种实体

我正在使用ASP.NET MVC 2和C#以及Entity Framework 4.0对标准化的SQL Server数据库进行编码。我的数据库结构的一部分包含一个包含外键的条目表,外键与包含驾驶员、汽车、发动机、底盘等的子表相关

我遵循书呆子晚餐教程,它为晚餐建立了一个足够公平的存储库。我是为司机、引擎、汽车等做一个,还是为参赛者做一个大的


这类工作的最佳实践是什么?我对这种编码方法还是个新手。

我想这方面没有单一的“最佳实践”——这取决于您的编码风格和应用程序的要求。您完全可以为系统中的每种实体类型创建一个存储库,这样就可以了

在你的情况下,我至少应该考虑拥有一个驾驶库,可能是第二个汽车、引擎、底盘(因为它们在相同的专业领域中有相同的用途——它们是相互连接的,它们是属于一起的)。 当然,如果汽车、引擎和底盘的单一仓库太臃肿,你可以考虑把它分解成三个单独的仓库。 我将尝试在存储库的数量(尝试将逻辑上属于一起的内容组合在一起)和这些存储库上的方法数量之间找到平衡。五个、十个方法都可以——如果你说的是20个、30个或50个方法,那么你的存储库可能太大、太笨拙了

这绝对是一个架构上的决定,因此,它们并不是指导你的很多硬事实——它更像是一种“直觉”和体验。如果你还没有那必要的经验——使用一种方法,使用它,当你完成后——用批判的眼光再次审视它,看看:它起了什么作用?那怎么办?没用?然后在下一个项目中,在项目结束时,尝试其他方法并质疑其有效性。活到老学到老

我正在为每个实体使用通用(参数化)存储库。此存储库包含基本的CRUD函数。除此之外,我还为每项功能提供服务。每个服务都实例化所需的存储库。ObjectContext对于所有请求都是通用的,每个请求都有一个ObjectContext。这是我的存储库界面:

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);

    //Creates from detached item
    void Create(T item);
    void Delete(int id);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}
公共接口IRepository
{
//检索表中的项目列表
IQueryable列表();
可查询列表(参数字符串[]包括);
//从分离的项创建
无效创建(T项);
无效删除(int-id);
T Get(int-id);
T Get(int-id,参数字符串[]包含);
void SaveChanges();
}

我也有通用的实现,虽然很长,但很容易实现。您不必为每种类型创建repository类,只需实例化
repository

就个人而言,我发现最好为每个表创建一个单独的存储库

然后,我创建一个
服务层
,在其中的一个类中,我将运行用于特定操作的所有命令(例如,将现有驾驶员的汽车更改为新添加的汽车)。如果我需要执行的操作包含多个相互关联的对象,那么我将在服务层调用多个存储库


我尽我最大的努力让我的存储库尽可能“愚蠢”,并将所有“聪明”的东西放在服务层。额外的
服务
层还可以帮助我避免控制器膨胀。

我通常拿数据库的图表,围绕我认为的更大的单元或系统画圆圈

这让我想起了商店里的“ProductSystem”、“OrderSystem”、“UserSystem”、“PaymentSystem”

如果系统太大,我就把它们分开

如果系统太少,我不在乎:不管怎样,一切都会增长


如果某个东西在某种程度上属于两个系统,我选择1并不再更改它,即使第二天的决定出现错误:我知道有一天我会再次更改它。

你想做什么?什么教程(添加链接)?我目前正在学习第3部分,该部分是创建存储库类。url是。我喜欢这种方法,但我团队的另一位开发人员提到,如果您的服务层必须进行4-5次表调用才能将所需的所有数据拼凑在一起,那么可能会存在性能问题。这是一种必要的邪恶,还是有一种策略可以减轻它?这是一个好的观点,那么当一个连接变得更有意义时呢?您的服务层将比在数据库上使用连接慢得多(一般来说)…您要指出的是,我提到的策略在哪里发生了故障。在这一点上,创建特定于函数的存储库可能是有意义的。这并不是说你必须放弃每个表都有一个存储库,你可以两者兼而有之。这就是我认为你有外键的原因。就像这样,也许你不需要实体/存储库内部的连接,如果我也需要涉及存储过程呢?也许有一些存储过程定义了自定义的插入或删除(除了简单的删除/插入之外,还意味着一些额外的东西)…这种方法+ER图帮助很大。