.NET Core 依赖注入向后兼容 .NET Framework?

.NET Core dependency injection backwards compatibility with .NET Framework?

我想重建一个 .NET Framework 库到 .NET Core,然后在 .NET Framework 应用程序中使用这个库。

库需要数据库连接字符串。在 .NET Core 中,我会使用依赖注入将带有连接字符串的配置传递给库 class。

public MyRepository(IConfiguration config)
{
    _connectionString = config.GetConnectionString("MyDb");
}

但是如何在不引入复杂的 DI 框架的情况下使用 .NET Framework 4.6 库中的 class?

您描述的场景是 .NET Standard 想要实现的。只有 class 库项目可以面向 .netstandard,并且任何此类库都与最新的 .NET Framework 应用程序以及 .NET Core 应用程序兼容。

Microsoft.Extensions.DependencyInjection 和 Microsoft.Extensions.Configuration 中的 .NET Core 程序集也 .netstandard 兼容,这意味着您可以在您的库和应用程序中使用它们。

所以,是的,您可以将 .NET Core DI 与 .NET Framework 一起使用,并且在库场景中只需坚持使用 .NET Standard APIs,它也适用于所有 .NET 实现。我有一些非常大、非常复杂的 .netstandard20 库,我将它们与针对这两个框架的应用程序一起使用,我很少需要问自己给定的 API 是否兼容,因为现在的覆盖范围非常好,但是你可以找到完整列表 here.

我已经在使用 .NET Framework 4.7.1 中的新 Microsoft.Extensions 库,主要是 DependencyInjection and Configuration 库。

2.x 库与 .NET Standard 2.0 兼容,这意味着它们可以添加到以任何与 .NET Standard 2.0 兼容的运行时为目标的应用程序,即 .NET Framework 4.7.1 及更高版本或 .NET Core 2.0 及更高版本。

在较旧的运行时(4.6.1 及更高版本)中,NuGet 可能必须添加一些额外的包,其中包含某些系统程序集的较新版本,例如 System.Runtime.

您根本无法将 2.0 扩展包添加到 4.6。您可以添加在 .NET Core 1.x.

中使用的较旧的 1.x 版本

配置 扩展在 .NET Core 和 Full Framework 中以相同的方式完成:

  1. 您创建一个 ConfigurationBuilder,添加配置提供程序并在最后调用 Build() 以获得一个 IConfigurationRoot 对象:

    IConfigurationRoot configRoot = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddJsonFile($"appsettings.json")
        .Build();
    
  2. 创建一个ServiceCollection,注册服务并调用BuildServiceProvider()得到一个ServiceProvider。您将使用该 ServiceProvider 创建需要注入的 类 实例。

ASP.NET Core,它也适用于 Full 框架,提供了隐藏样板代码的额外帮助程序库。

IServiceCollection services = new ServiceCollection();
ServiceProvider provider= services.AddSingleton<MyService>()
                                  .AddTransient<AnotherService>()
                                  .AddTransient<ServiceThatNeedsTheOthers>()
                                  .BuildServiceProvider();

假设第三个服务是:

public class ServiceThatNeedsTheOthers
{
    public ServiceThatNeedsTheOthers(MyService s1,AnotherService s2){..}
}

您可以使用以下方式创建它:

var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();

所有这些都在 MSDN 杂志的 Mark Michaelis 的 Essential .NET 专栏中进行了描述,例如 Dependency Injection with .NET Core and Configuration in .NET Core。这些文章展示了如何在您需要编写所有样板文件的控制台应用程序中设置和使用扩展。

PS ASP.NET Core 2.0 也可以针对 Full 框架。对于新的 Web 应用程序,创建一个针对 4.7.1

的 ASP.NET Core 2.0 项目可能是有意义的