Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 带有“的存储库模式”;“现代”;数据访问策略_Linq_Entity Framework_Repository Pattern - Fatal编程技术网

Linq 带有“的存储库模式”;“现代”;数据访问策略

Linq 带有“的存储库模式”;“现代”;数据访问策略,linq,entity-framework,repository-pattern,Linq,Entity Framework,Repository Pattern,因此,当我用多个数据存储实现存储库模式时,我在网上搜索最佳实践,发现我看待问题的方式完全颠倒了。这是我所拥有的 我的应用程序是一个BI工具,从(目前为止)四个不同的数据库中提取数据。由于内部限制,我目前正在使用LINQ to SQL进行数据访问,但需要一种允许我更改为实体框架或NHibernate或下一次数据访问的设计。我还坚持使用IoC框架(在本例中为Castle Windsor)在我的应用程序中分离层 因此,我使用Repository模式从我的业务层抽象出实际的数据访问代码。因此,我的业务对

因此,当我用多个数据存储实现存储库模式时,我在网上搜索最佳实践,发现我看待问题的方式完全颠倒了。这是我所拥有的


我的应用程序是一个BI工具,从(目前为止)四个不同的数据库中提取数据。由于内部限制,我目前正在使用LINQ to SQL进行数据访问,但需要一种允许我更改为实体框架或NHibernate或下一次数据访问的设计。我还坚持使用IoC框架(在本例中为Castle Windsor)在我的应用程序中分离层

因此,我使用Repository模式从我的业务层抽象出实际的数据访问代码。因此,我的业务对象是根据某些IRepository接口编码的,IoC容器用于管理实际实现。在本例中,我希望有一个具体的LinqRepository,它使用linqtosql实现接口来完成这项工作。稍后,我可以用eForepository替换它,而不需要对我的业务层进行任何更改

另外,因为我是根据接口编码的,所以我可以轻松地模拟存储库进行单元测试

因此,我在开始编写应用程序时遇到的第一个问题是,我应该为每个DataContext还是每个实体(正如我通常所做的那样)设置一个存储库?假设一个数据库包含具有预期关系的客户和销售人员。我应该有一个OrderTrackingRepository,其中的方法可以与两个实体一起使用,还是应该有一个单独的CustomerRepository和一个不同的SalesRepository

接下来,作为BI工具,主要接口用于报告、图表等,通常需要跨多个源的数据“mashup”。例如,现实情况是,一个数据库包含客户信息,而另一个数据库处理销售信息,第三个数据库保存其他财务信息,但我的要求之一是显示跨越这三个数据库的聚合信息。另外,我必须在UI中支持动态过滤。显然,直接针对LINQtoSQL或EFDataContext对象(例如,表)工作将允许我做任何事情。在使用存储库接口抽象DAL时,向我的业务逻辑公开相同功能的最佳方法是什么

本文:指出EF4已经改变了这种方法,存储库只不过是从EF DataContext返回的IQueryable,这带来了一整套其他问题

但是,我想我已经说得够多了

更新(谢谢,史蒂文!)

好的,让我举一个更具体(至少对我来说)的例子,并澄清几点,希望这将有助于我找到一种更好的方法

虽然我理解史提芬提出了什么,但我有一组开发人员在执行这些事情时必须考虑,我担心它们会在复杂度中迷失(是的,这里是一个真正的问题)。 因此,让我们删除与Linq到Sql的任何直接连接,因为我不想要一个依赖于L2S工作方式的解决方案——或者甚至是EF。我的目的是抽象出正在使用的数据访问技术,以便可以根据需要对其进行更改,而无需对业务层中的消费代码进行附带更改。我在过去通过向业务层提供IRepository接口来实现这一点。也许这些应该被命名为IUnitOfWork,或者更符合我的喜好的IdatService,但目标是一样的。例如,这些接口通常公开了Add、Remove、Contains和GetByKey等方法

这是我的情况。我有三个数据库要处理。一个是DB2,包含客户(特许经营权)的所有业务信息,例如他们的信息、产品、订单等。另一个是SQL Server数据库,包含他们的财务历史记录,而第三个SQL Server数据库包含特定于应用程序的信息。前两个数据库由多个应用程序共享

通过我的应用程序,客户可以输入/上传给定时间段内的财务信息。输入后,我必须执行以下步骤:

1.根据一组静态规则验证输入的数据。例如,数据必须包含合法的客户ID值(在上载的情况下)。这需要在DB2数据库中进行查找,以验证提供的客户ID是否存在并且是当前的。 2.接下来,我必须根据第三个(SQL Server)数据库中包含的一组动态规则验证数据。例如,给定值不能超过另一个值的某个百分比。 3.验证后,我将数据持久化到包含财务数据的第二个SQL Server数据库。 一直以来,我的代码都必须具有松散耦合的依赖项,以便在单元测试中模拟它们

作为分析的一部分,我知道我有三个不同的数据存储区要处理,还有大约六个实体(目前)要处理。一般来说,我假设我的应用程序中有三个DataContext,每个数据存储一个,实体由适当的数据上下文公开

然后,我可以为每个实体创建一个单独的I{repository | unit of work | service},该实体将由我的业务逻辑使用,具体实现知道使用哪个数据上下文。但随着实体数量的增加,这似乎是一个危险的提议,单个存储库(UoW)服务类型的数量也在增加

然后,以我的验证逻辑为例,它使用多个实体,从而使用多个数据上下文。我不确定这是最有效的方法

我还没有提到的另一个要求是在报告方面,我需要对其进行评估