0

我在 C# 和 Razor 中有一个 ASP.NET MVC3。应用程序的架构分为数据访问层(EF 类 + 存储库)、服务层、控制器、ViewModels 和 View。

从我的服务层ProductServices,我调用GetAllProducts我的 Repository 公开的方法ProductRepository,它具有以下签名:

IQueryable<Products> GetAllProducts()

因此,在ProductServices我调用 (productRepositoryProductRepository) 的一个实例:

var products = productRepository.GetAllProducts(); 

填充变量products。现在我想从 访问产品ProductName名称productServices。如果我使用这个指令:

var productNames = products.Select(m => m.ProductName).ToList();

我正在创建ServiceLayerEF之间的耦合(绕过存储库)。这意味着我必须添加到ProductRepository带有签名的方法:

IQueryable<string> GetAllProductsName()

但是,由于我的应用程序中需要其他产品信息,我应该为类productRepository的每个字段创建一个方法Product吗?我的推理正确吗?谢谢

4

2 回答 2

1

围绕这一点有两种思想流派,

  1. 存储库明确定义了您与数据库交互的方式,并且应该受到严格控制。因此,存储库上的方法应提供枚举数据
  2. 存储库打破了与特定数据源类型的强耦合,但不需要提供详细和枚举的数据集。

我个人订阅第二个,原因如下:

我的感觉是,当您在存储库中过于明确时,它会变成业务逻辑而不是解耦机制。我不太喜欢这样,因为这意味着您与存储库实现的联系更加紧密。

我还认为,在某些情况下,存储库不是枚举数据的正确位置,例如,我认为分页和排序是 UI 问题,但是对于性能而言,您希望查询仅与当前页面/排序相关。这意味着您要么需要让 UI 参与查询编译,要么存储库需要了解分页和排序。

话虽如此,提供未枚举的数据源确实会为以后的问题打开大门,即使您确实提供了它们,尽快枚举数据集也非常重要。

如果你有兴趣这里是我对存储库的看法:http: //blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html,所有代码也在github上

于 2012-02-20T11:57:22.560 回答
0

您在 productServices 中拥有所有信息,因为您使用 productRepository.GetAllProducts() 方法从存储库加载所有信息。如果您需要来自其他实体的更多信息,则需要使用新服务扩展您的 productServices。

但是,由于我的应用程序中需要其他产品信息,我是否应该在 productRepository 中为 Product 类的每个字段创建一个方法?我的推理正确吗?谢谢

在这种情况下,我通常为服务创建扩展方法,而不是在存储库中。存储库通常有一个 CRUD 设置,仅此而已。

于 2012-02-20T13:47:32.463 回答