我是存储库模式的新手,但我正在创建一个存储库来连接到具有相同数据结构的两种不同数据库类型。我应该在哪里以及如何处理连接?
以下是我的要求/约束/项目说明
我发现的所有教程都讨论了在GetRecords()方法调用中打开连接。但是,这似乎限制了我一个数据库。
那么,我应该将连接对象传递给我的GetRecords方法吗?: GetRecords(MyIDbConnection)?如果我决定使用XML(无论出于何种原因),这似乎限制了我。
在我的GetRecords方法中,我应该调用App.Config来获取连接字符串吗?如果将此存储库编译为没有app.config的.dll,这会限制我吗?
我应该通过构造函数传递连接吗?
我可以以某种方式使用数据适配器吗?
请告知。
谢谢。
答案 0 :(得分:1)
您可能需要考虑将Gateway模式与Repository模式结合使用,以便为存储库提供与数据访问层通信的通用方法。 Gateway将提供一个标准的,与平台无关的接口,不需要Repository了解有关底层数据源及其相应API的任何信息。您可以使用DI框架将Gateway的实例注入到您的存储库中。这将允许您通过中央组件配置策略控制向存储库提供哪种类型的网关。
答案 1 :(得分:0)
有一个通用的ADO.Net组件层:IDbConnection,IDbCommand,IDbTransaction,IDataReader等.SqlClient和ADO OracleCLient都实现了这些接口,所以理论上您可以让存储库返回通用接口并再次编码它们。
答案 2 :(得分:0)
标准答案是#3 - 您应该通过构造函数传递IDbConnection
(或DataContext
或其他类似连接的对象)。
大多数实现还有一个默认构造函数,它将null
传递给特定的构造函数。然后,特定构造函数检查null
,如果遇到,则使用app.config
获取默认连接字符串或使用实际DI框架创建完全通用连接。这样,您的应用程序代码就不必一直传递构造函数参数 - 您只能将其用于测试/模拟。
顺便说一句 - 我相信NHibernate支持DB2,因此您可能需要将其视为原始ADO.NET的替代方案。存储库的实现方式大致相同,对构造函数采用ISession
参数。