4

我正在努力将控制台应用程序从 .NET Framework 4.6.2 移植到 .NET Core 2.0。应用程序需要连接到编译时平台未知的数据库。在完整的框架中,这很容易通过使用DbProviderFactories.NET Core 2.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放入应用程序的文件夹,但是该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 中开发与 DB 无关的应用程序的好方法是什么?

4

0 回答 0