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

时间:2018-03-30 09:45:41

标签: c# .net-core .net-standard

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

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

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

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

2 个答案:

答案 0 :(得分:7)

我已经在.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();
    
  2. 创建一个ServiceCollection,注册服务并调用BuildServiceProvider()以获得ServiceProvider。您将使用该ServiceProvider创建需要注入的类的实例。

  3. 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>();
    

    所有这些都在Mark Michaelis&#39; MSDN杂志中的基本.NET专栏,例如Dependency Injection with .NET CoreConfiguration in .NET Core。这些文章展示了如何在控制台应用程序中设置和使用扩展,您需要编写所有样板文件。

    PS ASP.NET Core 2.0也可以定位到Full框架。对于新的Web应用程序,创建面向4.7.1

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

答案 1 :(得分:0)

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

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

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