【问题标题】:.NET Core dependency injection backwards compatibility with .NET Framework?.NET Core 依赖注入向后兼容 .NET Framework?
【发布时间】:2018-03-30 09:45:40
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我已经在使用 .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 创建需要注入的类的实例。

    同样适用于完整框架的 ASP.NET Core 提供了隐藏样板代码的额外帮助程序库。

    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 CoreConfiguration in .NET Core。这些文章展示了如何在需要编写所有样板的控制台应用程序中设置和使用扩展。

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

    【讨论】:

    • 删除了 .NET Framework 的 4.6 版本,因为我对如何在与 dotnet 标准兼容的 .NET Framework 中执行此操作很感兴趣
    • 然后使用 4.7.1。它与标准 2.0 兼容,因此不需要任何额外的库
    • @fantastischIdee PS ASP.NET Core 2.0 也可以针对整个框架,而不仅仅是 Core。如果你想创建一个 Web 应用程序,你可能应该创建一个 ASP.NET Core 2.0 项目
    • @PanagiotisKanavos 我将这个问题解释为他想要创建一个使用 DI 的 .netstandard20 库,该库将被 .NET Framework 应用程序引用。没有提到构建网络应用程序。
    • 轻而易举。您必须添加相同的网络核心包Microsoft.Extensions.Logging.Log4Net.AspNetCore并使用services.AddLogging(opt =&gt; opt.AddLog4Net("log4net.config")),非常感谢您的回答。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我了解 .NET Standard 的目的是什么。但我对如何设置我的 .NET Framework 应用程序以使 IConfiguration 可用于 MyRepository 中的 DI 感兴趣。在 .NET Core 中,这是由 WebHost.CreateDefaultBuilder 为我完成的...
    • 您熟悉组合根的 DI 概念吗?基本上,应用程序负责注册 DI 服务,然后库中的构造函数 DI 自动“正常工作”。 (如果您的库还需要注册 DI 服务,请在库中添加服务注册扩展,并在启动期间从应用程序中调用它。)如果您不熟悉,我可以打开另一个答案来演示。
    • @fantastischIdee 4.6 不行。 4.6.1 可能,只需添加包。 配置控制台/非核心应用程序包是另一回事
    • @McGuireV10 你不能在没有配置的情况下添加任何 DI 库。 ASP.NET Core 提供了即使在 .NET Core 控制台应用程序中也不可用的帮助程序。一般来说,这不是关于 DI 的问题
    • @PanagiotisKanavos 我有六个 .NET Core 实用程序控制台程序,它们每 5 分钟 24/7 建立一个非常复杂的依赖于 DI 的库,并且相同的库也适用于 .NET Framework Azure 网站。不太确定您要说什么,但 .NET Core DI 很容易在没有 ASP.NET Core 的情况下使用。
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多