C# 如何编写与DB无关的.NET核心应用程序?

C# 如何编写与DB无关的.NET核心应用程序?,c#,ado.net,.net-core,sqlclient,database-agnostic,C#,Ado.net,.net Core,Sqlclient,Database Agnostic,我正在努力将控制台应用程序从.NET Framework 4.6.2移植到.NET Core 2.0。该应用程序需要连接到编译时平台未知的数据库。在完整的框架中,这可以通过使用.NETCore2.0中不再存在的机制轻松实现 首先,我想我可以自己动态加载相应的DbProviderFactory,使用类似以下代码: public static DbProviderFactory GetFactory(string providerInvariantName) { Type type = Ty

我正在努力将控制台应用程序从.NET Framework 4.6.2移植到.NET Core 2.0。该应用程序需要连接到编译时平台未知的数据库。在完整的框架中,这可以通过使用.NETCore2.0中不再存在的机制轻松实现

首先,我想我可以自己动态加载相应的
DbProviderFactory
,使用类似以下代码:

public static DbProviderFactory GetFactory(string providerInvariantName)
{
    Type type = Type.GetType(dbProvider.Type);
    if (null != type)
    {
        FieldInfo field = type.GetField("Instance", BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public);
        if (null != field && field.FieldType.IsSubclassOf(typeof(DbProviderFactory)))
        {
            object value = field.GetValue(null);
            if (value != null)
            {
                return (DbProviderFactory)value;
            }
        }
    }
}
就这样。只要包含
DbProviderFactory
的程序集在编译时被引用,该代码就可以很好地工作(这与动态加载的目的背道而驰)

我试图将
System.Data.SqlClient.dll
放到应用程序的文件夹中,但是
实例
字段是
null
,因为这似乎只是不同
运行时
程序集的存根实现。当静态引用时,编译器会抛出一个详细的
.deps.json
文件,指向这些文件。以下是给人留下印象的一点小收获:

...
"runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": {
  "type": "package",
  "serviceable": true,
  "sha512": "sha512-38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==",
  "path": "runtime.win-x64.runtime.native.system.data.sqlclient.sni/4.4.0",
  "hashPath": "runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
},
"runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": {
  "type": "package",
  "serviceable": true,
  "sha512": "sha512-YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==",
  "path": "runtime.win-x86.runtime.native.system.data.sqlclient.sni/4.4.0",
  "hashPath": "runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512"
},
...
这不是可以手动输入的内容


那么,在.NET Core中开发DB不可知应用程序的好方法是什么呢?

该应用程序实际需要支持多少种不同类型的DB?如果按照设计,它可以配置为使用任何类型的数据库,那么在将
dbProviderFactorys
支持添加到.NET核心(正在开发中)之前,可能没有简单的解决方案。@DylanNicholson:这是一个相对封闭的列表,包含大约5种常见的RDBMS。我想,我可以有不同版本的应用程序,针对特定的提供商进行编译。也许我可以针对所有可能的提供者进行编译,然后在部署时只根据需要交付依赖项。但我不知道该怎么做。这需要一种类似“软依赖”的机制。