如何编写与DB无关的.NET Core应用程序?

时间:2017-11-26 10:06:06

标签: c# ado.net .net-core sqlclient database-agnostic

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

首先,我想我可以自己动态加载相应的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;
            }
        }
    }
}

完成in this library here。只要在编译时引用包含DbProviderFactory的程序集(这种方法违背动态加载的目的),此代码就可以正常工作。

我尝试将System.Data.SqlClient.dll放入应用的文件夹,但Instance字段为null,因为这似乎只是不同runtimes的存根实现组件。静态引用时,编译器会发出一个指向那些的详细.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中开发与数据库无关的应用程序会是什么好方法呢?

0 个答案:

没有答案