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

fan*_*dee 9 c# .net-core .net-standard

我想将.NET Framework库重建为.NET Core,然后在.NET Framework应用程序中使用此库.

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

public MyRepository(IConfiguration config)
{
    _connectionString = config.GetConnectionString("MyDb");
}
Run Code Online (Sandbox Code Playgroud)

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

Pan*_*vos 10

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

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();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个ServiceCollection,注册服务并调用BuildServiceProvider()get ServiceProvider.您将使用该ServiceProvider创建需要注入的类的实例.

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

IServiceCollection services = new ServiceCollection();
ServiceProvider provider= services.AddSingleton<MyService>()
                                  .AddTransient<AnotherService>()
                                  .AddTransient<ServiceThatNeedsTheOthers>()
                                  .BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)

假设第三项服务是:

public class ServiceThatNeedsTheOthers
{
    public ServiceThatNeedsTheOthers(MyService s1,AnotherService s2){..}
}
Run Code Online (Sandbox Code Playgroud)

你可以创建它:

var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();
Run Code Online (Sandbox Code Playgroud)

所有这一切都是在MSDN杂志马克米氏基本.NET塔,例如描述依赖注入与.NET的核心配置在.NET的核心.这些文章展示了如何在控制台应用程序中设置和使用扩展,您需要编写所有样板文件.

PS ASP.NET Core 2.0也可以针对Full框架.对于新的Web应用程序,创建面向4.7.1的ASP.NET Core 2.0项目可能是有意义的