C# .NET核心依赖项注入是否与.NET Framework向后兼容?

C# .NET核心依赖项注入是否与.NET Framework向后兼容?,c#,.net-core,.net-standard,C#,.net Core,.net Standard,我想将.NET Framework库重建为.NET Core,然后在.NET Framework应用程序中使用此库 库需要数据库连接字符串。在.NETCore中,我将使用依赖项注入将带有connectionstring的配置传递给库类 public MyRepository(IConfiguration config) { _connectionString = config.GetConnectionString("MyDb"); } 但是,如何使用.NET Framework 4.

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

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

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

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

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

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


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

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

2.x库与.NET标准2.0兼容,这意味着它们可以添加到针对任何与.NET标准2.0兼容的运行时的应用程序中,即.NET Framework 4.7.1及以上版本或.NET Core 2.0及以上版本

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

您根本无法将2.0扩展包添加到4.6。您可以添加在.NETCore1.x中使用的较旧的1.x版本

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

  • 创建ConfigurationBuilder,添加配置提供程序,最后调用Build(),以获取
    IConfigurationRoot
    对象:

    IConfigurationRoot configRoot = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddJsonFile($"appsettings.json")
        .Build();
    
    假设第三项服务是:

    public class ServiceThatNeedsTheOthers
    {
        public ServiceThatNeedsTheOthers(MyService s1,AnotherService s2){..}
    }
    
    您可以通过以下方式创建它:

    var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();
    
    var service3=provider.GetRequiredService();
    
    所有这些都在MSDN杂志的MarkMichaelis的Essential.NET专栏中进行了描述,例如和。这些文章展示了如何在需要编写所有样板文件的控制台应用程序中设置和使用扩展


    PSASP.NET Core 2.0也可以针对整个框架。对于一个新的web应用程序,创建一个以4.7.1为目标的ASP.NET Core 2.0项目可能是有意义的

    是的,我理解.NET标准的目的。但我感兴趣的是如何设置我的.NET Framework应用程序,以便在MyRepository中为DI提供IConfiguration。在.NETCore中,这是由WebHost.CreateDefaultBuilder为我完成的…您熟悉组合根的DI概念吗?基本上,应用程序负责注册DI服务,然后库中的构造函数DI自动“正常工作”。(如果您的库还需要注册DI服务,请在库中添加服务注册扩展,并在启动期间从应用程序调用该扩展。)如果您不熟悉,我可以打开另一个答案进行演示。@fantastischIdee 4.6 no go。4.6.1如果可能,只需添加包即可。为控制台/非核心应用程序配置包是另一回事though@McGuireV10您不能只添加任何DI库而不进行配置。ASP.NET Core提供了即使在.NET Core控制台应用程序中也不可用的帮助程序。这不是一个关于DI的问题general@PanagiotisKanavos我有六个.NET核心实用工具控制台程序,它们每5分钟24/7地支持一个非常复杂的依赖DI的库,而同一个库也可以在.NET Framework Azure网站中运行。我不太清楚您想说什么,但是.NET Core DI在没有ASP.NET Core的情况下使用起来很简单。删除了.NET Framework的4.6版本,因为我感兴趣的是如何在与dotnet Standard兼容的.NET Framework中执行此操作,然后使用4.7.1。它与标准2.0兼容,因此不需要任何额外的功能libraries@fantastischIdeePS ASP.NET Core 2.0还可以针对整个框架,而不仅仅是Core。如果您想创建一个web应用程序,您可能应该创建一个ASP.NET Core 2.0project@PanagiotisKanavos我把这个问题解释为他想创建一个使用DI的
    .netstandard20
    库,它将被.NETFramework应用程序引用。没有提到构建一个web应用程序,这很容易。您必须添加相同的net core软件包Microsoft.Extensions.Logging.Log4Net.AspNetCore并使用
    services.AddLogging(opt=>opt.AddLog4Net(“Log4Net.config”))
    ,非常感谢您的回答。
    var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();