如何从服务层访问EF类属性

时间:2012-02-20 11:44:36

标签: c# asp.net-mvc-3 repository service-layer coupling

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

从我的服务层ProductServices我调用我的存储库GetAllProducts公开的方法ProductRepository,该方法具有以下签名:

IQueryable<Products> GetAllProducts()

因此,在ProductServices内,我呼叫(productRepositoryProductRepository的一个实例):

var products = productRepository.GetAllProducts(); 

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

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

我正在 ServiceLayer EF 之间建立耦合(绕过存储库)。这意味着我必须向ProductRepository添加一个带签名的方法:

IQueryable<string> GetAllProductsName()

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

2 个答案:

答案 0 :(得分:1)

围绕着这两个思想流派,

  1. 存储库显式定义了与数据库交互的方式,应该严格控制。因此,存储库上的方法应该提供枚举数据
  2. 存储库打破了与特定数据源类型的强耦合,但不需要提供详细的枚举数据集。
  3. 我个人订阅了第二个,为什么:

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

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

    已经说过提供未列举的数据源确实会让您在以后的轨道上遇到问题,即使您确实提供了它们,也应该尽快枚举该集合。

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

答案 1 :(得分:0)

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

  

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

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