问题描述
好了,不知道这是完全正确的标题,但基本上我一直有很多使用MVC应用程序库以这样的方式,你可以代替一组库的问题,实施了不同的数据存储技术,另一回事。
例如,假设我想使用实体框架我的应用程序。不过,我也希望有一个集硬件codeD列表实现的测试数据。我想有一组接口(IUserRepository,IProductRepository等 - 让我们不要谈论一个更通用的IRepository< T>现在)这两种方法可以实例。然后,使用(比如说)依赖注入工具,如Ninject或温莎城堡,我可以来回切换实体框架提供商(访问实际的数据库)和测试提供商(访问列表)之间。
在简单地说,这里有一个问题:
- 如果你要使用实体框架,你希望你的仓库返回的IQueryable< SOMETYPE取代。
- 如果你要使用硬codeD列表,您不希望您的仓库返回IQueryable的,因为它增加了巨大的开销,再加上,LINQ到实体是Linq的显著不同于对象,造成在code是常见的两种提供商许多头痛的问题。
在换句话说,我发现,最好的办法隔离所有的EF-依赖code的仓库内,从而使自己仓库的IEnumerable返回IList的,或或一些这样的 - 那么这两个EF和其他一些技术能够使用相同的存储库。因此,所有的IQueryable的将被包含在所述的EF库。这样一来,你可以使用LINQ到实体与EF库,和LINQ to对象的测试库。
然而,这种方法使业务逻辑的大量的入仓库,并导致许多重复code - 接收逻辑在每个存储库中被复制,即使实现方式有所不同
存储库,因为这一层,这是非常薄的,只是连接到数据库,将丢失的整体思路 - 存储库是业务逻辑的仓库,以及数据存储连接。你不能只是还查找,保存,更新等。
我一直未能解决需要隔离提供商依赖性code和有业务逻辑在一个集中的位置之间的差异。
任何想法?如果任何人都可以指向我针对这一问题实现的一个例子,我将不胜AP preciative。 (我读了很多,但无法找到任何具体谈这些问题。)
更新:
我想我开始觉得这可能不是可能有一个可以换出不同的供应商资料库 - 如果你要使用实体框架,例如,你只需要把你的整个应用程序实体框架。单元测试?我与挣扎。我这一点的做法是设置了硬codeD数据单独存储库,并利用它来进行单元测试,以及测试应用程序本身是建立在数据库之前。我想我将不得不寻求不同的解决方案,或许有些嘲讽的工具。
但随后引发为什么使用库的问题,特别是为什么使用存储库接口。我正在此。我认为,确定最佳的做法是要采取一些研究。
我能说什么?欢迎来到俱乐部...
你所发现的是,许多开发商谁遵循库潮与EFv4达到的问题。是的,它是这个问题,这个问题是非常复杂的。我讨论了好几次:
- 在当前
独立的主题就是为什么要使用库:
基本上你提出的方法是一个解决方案,但你真的想要吗?在我看来,结果不是资源库,但数据访问对象(DAO)暴露大量的访问方法。由存储库的定义是:
I believe exposing IQueryable
fulfils this 100 times better then creating a public interface similar to repositories from Stored procedures era - one access method per stored procedure (fixed query).
The problem can be summarized by the rule of leaky abstraction. IQueryable
is an abstraction of the database query but the features provided by IQueryable
are dependent on the provider. Different provider = different feature set.
What is a conclusion? Do you want such architecture because of testing? In such case start using integration tests as proposed in first two linked answers because in my opinion it is the lest painful way. If you go with your proposed approach you should still use integration tests to verify your repositories hiding all EF related logic and queries.
这篇关于使用存储库模式,支持多个供应商的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!