我有一个隐藏不同ADO.NET提供程序差异的DLL,并且有很多代码,如:
private static void AppendProviderSpecificParameterCmdStr(StringBuilder sb, DbCommand cmd, string fieldNameToUse, ComparisonOperator oprtr, string parameterName)
{
if (cmd is System.Data.OracleClient.OracleCommand || cmd is Oracle.DataAccess.Client.OracleCommand)
{
sb.AppendFormat("{0}{1}:{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
}
else if (cmd is SqlCommand)
{
sb.AppendFormat("{0}{1}@{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
}
else if (cmd is OleDbCommand)
{
sb.AppendFormat("{0}{1}?", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd));
}
else
{
throw new Exception(string.Format("Wrong database command type: {0},", cmd.GetType()));
}
}
其中比较运算符是我自己的枚举。
Oracle.DataAccess存在于具有oracle客户端的所有计算机上,并且此代码已满足我的需求。但是现在我遇到的情况是只有SqlClient,他们根本不需要oracle。所以我的代码只有在我复制Oracle.DataAccess.dll时才有效,这自然是一个可怕的解决方案。如何以正确的方式做到这一点?
谢谢-matti
答案 0 :(得分:1)
我不会将对dll的依赖称为可怕的解决方案。您的解决方案支持Oracle,因此您的解决方案中有一个oracle dll - 它就是它。
也就是说,你可以做的事情是抽象出命令类型。
一 - 创建实现接口的完整数据访问方法。您当前的解决方案我将其归类为通用数据访问的辅助工具或实用工具方法。您可以改为将接口声明为特定于域 - 例如客户 - 例如ICustomerDA。在您的情况下,您将拥有3个ICustomerDA.Insert实现,其中包含数据库细节。您的主要代码只需要了解ICustomerDA。这可能是我在更大的解决方案中所做的,因为RDBMS之间的差异和功能远远超出了参数声明。
两个 - 如果你想坚持更多的帮助/实用工具的想法,你可以为db对象的包装器创建一个接口,比如IDBCommand。实现IDBCommand将隐藏底层命令对象,然后具有.AppendProviderSpecificParameterCmdStr方法的特定实现,这将允许您执行以下操作:
OracleDbHelper : IDbCommand...
public void AppendProviderSpecificParameterCmdStr(...){
sb.AppendFormat("{0}{1}:{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
}
IDBCommand cmd = DAFactory.GetCommand();
cmd.AppendProviderSpecificParameterCmdStr(...
这两种解决方案的关键是通过主项目的通用接口而不是单个类型进行引用。完成此操作后,您可以在工厂中使用反射或更好地使用类似MEF之类的内容来创建实际类型。
答案 1 :(得分:0)
所以我的代码只有在我复制Oracle.DataAccess.dll
时才有效
除非您还拥有本机OCI DLL,例如因为您已经安装了Oracle客户端。
为避免强制用户安装完整的Oracle客户端,您可以将Oracle Instant 客户端中的DLL与应用程序一起分发。如果用户从不选择连接到Oracle,则永远不会调用这些DLL,只是静静地坐在那里而不会造成任何麻烦。
有关分发内容以及如何覆盖32位和64位的一些提示,请查看this post。
我们有一个自行开发的抽象层,目前可以与Oracle和MS SQL Server一起使用(并且可以移植到任何具有不错的ADO.NET提供程序的DBMS),到目前为止,该系统运行良好。