2012-02-20 56 views
0

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

从我的服务层ProductServices我调用该方法GetAllProducts暴露通过我的库ProductRepository,其具有以下特征:

IQueryable<Products> GetAllProducts() 

ProductServices我请因此(productRepositoryProductRepository一个实例):

var products = productRepository.GetAllProducts(); 

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

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

ServiceLayerEF(绕过库)之间建立连接。这意味着我必须补充到ProductRepository的方法有签名:

IQueryable<string> GetAllProductsName() 

然而,因为我在我的应用程序需要其他的产品信息,我将创建一个productRepository方法为Product类的各个领域?我的推理是否正确?由于

+0

为什么你需要服务层,如果它只是代理请求? – Eranga 2012-02-20 11:49:46

+0

感谢您的回答。当然,我的服务层也有所有业务逻辑和几种方法,这就是为什么我需要它 – CiccioMiami 2012-02-20 11:56:11

+0

是什么让你认为这种耦合类型是不好的? – Eranga 2012-02-20 11:59:03

回答

1

即使世界各地的这两个思想流派,

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

我个人订阅第二,继承人为什么:

我的感觉是,当你在仓库内得到明确的过度它变成商业逻辑,而不是分离机构。我不太喜欢这个,因为这意味着你变得更紧密地联系到存储库实现。

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

话虽如此,提供未列举的数据源确实会为您解决后续问题提供帮助,即使您确实提供了尽快枚举集合非常重要。

如果你有兴趣我的继承人采取的库:http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html,所有的代码也是在github

+0

感谢您的答案。因此,你建议我不要创建特定的方法并通过服务层访问该字段,绕过存储库? – CiccioMiami 2012-02-20 12:01:57

+0

我的感觉是,通过直接访问查询,您实际上并未绕过存储库,因此您需要做一个运行时间扩展。所以是的,我会很好地使用一个选择后,你从存储库中得到的设置。在这里还需要注意的是,select实际上是LINQ的函数,而不是EF或者你的仓库,它也很乐意在枚举集合上工作。 – 2012-02-20 12:05:34

+0

,如果我事先知道数据库(因此EF)将被替换?如果我只是从'productRepository'访问字段,我必须改变这个层 – CiccioMiami 2012-02-20 12:38:18

0

您的productServices,因为您从库与方法productRepository.GetAllProducts加载所有信息全部信息()。如果您需要其他实体的更多信息,则需要使用新服务扩展您的产品服务。

然而,因为我在我的应用程序需要其他的产品信息, 应创建为 产品类的每个领域productRepository一个方法是什么?我的推理是否正确?谢谢

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

+0

谢谢,这意味着你直接访问服务层中的字段?当然,除了GetAllProducts之外,我还有其他方法,因为它们没有问题的范围,所以我没有在这里列出。 – CiccioMiami 2012-02-20 14:14:07

+0

在这种情况下是的。如果您在其他应用程序或数据库上下文(e.q WPF应用程序或移动应用程序)中需要此逻辑,则永远不会。通过您的服务架构,您可以以一种好的方式处理这种情况。 – glenn 2012-02-20 17:21:58