我在C#和Razor中有一个ASP.NET MVC3。应用程序的体系结构分为数据访问层(EF类+存储库),服务层,控制器,ViewModel和View。
从我的服务层ProductServices
我调用我的存储库GetAllProducts
公开的方法ProductRepository
,该方法具有以下签名:
IQueryable<Products> GetAllProducts()
因此,在ProductServices
内,我呼叫(productRepository
是ProductRepository
的一个实例):
var products = productRepository.GetAllProducts();
填充变量products
。现在,我想从ProductName
访问产品productServices
的名称。如果我使用这个指令:
var productNames = products.Select(m => m.ProductName).ToList();
我正在 ServiceLayer 和 EF 之间建立耦合(绕过存储库)。这意味着我必须向ProductRepository
添加一个带签名的方法:
IQueryable<string> GetAllProductsName()
但是,由于我在我的应用程序中需要其他产品信息,我是否应该在productRepository
类的每个字段中为Product
创建一个方法?我的推理是否正确?感谢
答案 0 :(得分:1)
围绕着这两个思想流派,
我个人订阅了第二个,为什么:
我的感觉是,当你在存储库中过度明确时,它会变成业务逻辑而不是解耦机制。我不是很喜欢这个,因为它意味着你与存储库实现的联系更紧密。
我还认为在某些情况下,存储库不是枚举数据的正确位置,例如我认为分页和排序是一个UI问题,但是对于性能,您希望查询仅与当前页面/排序相关。这意味着您需要让UI参与查询编译,或者存储库需要了解分页和排序。
已经说过提供未列举的数据源确实会让您在以后的轨道上遇到问题,即使您确实提供了它们,也应该尽快枚举该集合。
如果你感兴趣的是我对存储库的看法:http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html,所有代码也在github上
答案 1 :(得分:0)
您拥有productServices中的所有信息,因为您使用方法productRepository.GetAllProducts()从存储库加载所有信息。如果您需要来自其他实体的更多信息,则需要使用新服务扩展productServices。
但是,由于我的申请中需要其他产品信息, 我应该在productRepository中为每个字段创建一个方法 产品类?我的推理是否正确?感谢
在这种情况下,我通常会为服务创建Extensions方法,而不是在存储库中。存储库通常具有CRUD设置,仅此而已。