शेख*_*ेखर 3 c# asp.net orm ado.net multi-database
我遇到需要创建一个支持多个数据库的应用程序的情况。多个数据库意味着客户端可以首先使用Oracle,SQL Server,MySQL,PostgreSQL等任何数据库。
我正在尝试使用NHibernate或MyBatis之类的ORM。但是它们有局限性,需要专业知识才能使用。
因此,我决定使用Microsoft提供的数据提供程序,例如ADO.NET,OLEDB,ODP.NET等。
有什么办法可以使我的数据库逻辑对于所有数据库保持相同?我已经尝试过了IDbConeection,IDbCommand等等,但是在Oracle(Ref Cursor)的情况下它们有问题。
我有什么办法可以做到这一点?一些链接或指南,将不胜感激。
编辑:
DBType存在问题,因为它们的枚举对不同的数据提供程序进行了不同的定义。
好吧,现实生活中的应用程序是如此复杂。在不知不觉中,您想要用一个应用程序替换UI,将您的逻辑公开为WCF服务,与另一服务提供商一起更改电子邮件服务,在模拟DAL的同时测试代码段,并与另一服务提供商一起更改数据库。 。
解决此问题的常用方法是通过将实现与调用者分开的接口传递所有调用。之后,您可以实现不同的DAL。
我个人通常使用这种方法:
基本上,您现在拥有一个可以与单个数据库,邮件提供程序等一起使用的软件,到目前为止,一切都很好。
接下来,重新设计工厂。基本上,您希望使用配置设置为数据选择正确的提供程序(实现您的接口的正确DLL)。在大多数情况下,简单的开关就足够了。
在这一点上,我通常习惯于对接口进行大量的单元测试。
最后一步是为不同的数据库提供程序创建DLL。其中之一将在运行时加载到您的应用程序中。
我喜欢简单的Linq而不是SQL(我也使用LinqConnect的库),因为它非常快。我只是从复制粘贴另一个数据库提供程序开始,然后对其进行重新设计,直到它起作用为止。我个人不相信神奇的“支持所有sql数据库”解决方案:根据我的经验,某些数据库处理某些查询的速度比其他数据库快得多,这意味着您可能最终会获得一些自定义代码,无论如何,每个数据库。
这也是您的单元测试将真正获得回报的地方。基本上,您可以从复制粘贴开始并进行测试。如果幸运的话,一切都将立即以不错的性能运行...如果没有,您知道从哪里开始。
建立到最后
建立持久的东西。事情将会改变:
实体框架呢
因此,我已经看到许多客户在性能方面遇到麻烦。在多次测试中,我都有相同的经历。我注意到客户围绕EF进行大量查询,从而获得了不错的性能。
公平地说,我几年前就放弃了,我知道他们已经对性能进行了相当大的改进。不过,在考虑之前,我会先对其进行测试(尤其是复杂查询)。
如果我要使用EF,则可以在“数据库通用DLL”中实现所有EF东西,然后从中派生类。正如我所说,并不是所有数据库的查询都相同-您可能想要实现一些必要的技巧,以取得良好的性能。您的测试会告诉您。
奖金
通过接口进行编程的其他原因与代理相结合具有很多优势。仅举几例,您只需实现同一接口即可轻松创建日志接收器,缓存,统计信息,WCF等。而且,如果最终有一天您讨厌当前的OR映射器,则可以将其丢弃而无需触摸应用程序的任何一行。
| 归档时间: |
|
| 查看次数: |
1495 次 |
| 最近记录: |