交换程序集以实现DBMS特定的功能

时间:2011-04-12 15:28:45

标签: asp.net database-connection architecture

(继续我的问题here,但认为它与开始一个新线程不同)

我想编写一个应用程序,允许最终客户使用他们首选的DBMS(SQLServer,Oracle等)作为后端。

我可以让主应用程序调用位于单独程序集中的“Factory”对象,该对象将返回特定于DBMS的对象,该对象实现包含数据库访问所需的所有调用的公共接口。但是,这意味着为每个安装部署所有可能的DBMS系统的编译代码。工厂只选择配置的组件。

有人会评论这种替代方法吗? :我可以为每个使用相同名称空间的DBMS创建单独的程序集,例如: MyDBMS,并实现相同的接口。安装后,我们只为客户选择的DBMS部署程序集。通过更改构建配置以使程序集都具有相同的名称,COM ID等,然后主应用程序将不知道差异。我已经对此进行了测试,看起来效果非常好。

只是想知道这个的利弊?主要的好处是我们可以提供额外/更新的DBMS DLL而无需任何其他重新部署。

由于

2 个答案:

答案 0 :(得分:2)

理想情况,我建议你在前一个帖子中传递它,就像nHibernate这样的ORM工具。在大多数情况下,数据库设计不会过多地偏离标准,这将很好地工作。在一些大型应用程序中,基本上在存储过程,ORM工具等方面有性能改进的应用程序将开始施加限制。

你可以从另一个方面看,并说我只支持使用它们共同的行为来支持多个数据库。

ADO.NET提供了一系列大多数主要提供商使用的界面:IDbCommandIDbConnectionIDbTransaction。这里的缺点是您通常无法利用提供程序特定的功能或改进。

企业库中的数据访问应用程序块执行此操作。你可以走这条路,如果你需要特定的东西,你可以更改EntLib代码以支持你的应用程序的特定要求。

这样,您就可以获得大部分逻辑。如果您遇到问题(可能没有),则可以访问源代码以解决问题。

答案 1 :(得分:1)

是的,可能:这就是DBMS驱动程序(例如ADO.NET中的驱动程序)的工作方式(除了它们在共享相同的接口/契约时具有不同的名称/程序集)。 / p>

如果在配置上使用交换程序集,那么它是完成配置的交易(例如,文件系统与配置条目)。有些事情需要考虑,例如强名称和显式版本。

我无法证明只需交换程序集,并且需要配置条目(而不是交换)的一些优点是:

  1. 其他参数(如凭据或选项)也可以轻松存储/传递到工厂/激活器。
  2. 保持程序集名称不同而不那么容易混淆同样简单:哪个 DAL是thedall.dll? (如果版本等相同,唯一要做的就是一些校验和或解编译或'信息'方法。不是很有趣。)
  3. 可以同时安装多个后端,这可以简化分发包和测试等。
  4. 不需要像控制构建步骤那样多。不需要“劫持”GUID或声称所有版本都是相同版本。
  5. 我过去使用的一个工具是iBATIS,有iBATIS.NET。它与Hibernate或Active Record等不在同一个“ORM类”中,因为它是定义的SQL语句和对象之间的简单映射器。非常原始,是的。需要大量的SQL,是的。但是有些人发誓。

    快乐的编码。