【问题标题】:Dependency Injection in .NET Core Main() Not Working.NET Core Main() 中的依赖注入不起作用
【发布时间】:2019-11-20 16:38:38
【问题描述】:

我有一个类库,我在 .NET Core Web API (netcoreapp2.2) 的 Main() 方法中实例化了一个类,用于检索 Web API 的配置:

public static void Main(string[] args)
{
    var configBuilder = new ConfigBuilder("configuration-v1.json").Build();

    WebHost.CreateDefaultBuilder(args)
        .UseConfiguration(configuration)
        .UseStartup<Startup>()
        .Build()
        .Run();
}

构造函数ConfigBuilder是:

public AwsConfigurationBuilder(string configKey, IAmazonS3ClientAdapter s3Client)

我在Startup.cs 中的ConfigureServices 方法是:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddScoped<IAmazonS3ClientAdapter, AmazonS3ClientAdapter>()
        .AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

我收到以下关于 ConfigBuilder 实例化的错误:

There is no argument given that corresponds to the required formal parameter 's3Client' of 'ConfigBuilder.ConfigBuilder(string, IAmazonS3ClientAdapter)' [Foo.BarService]csharp(CS7036) 

难道不能在服务的Main 方法中进行依赖注入吗?

【问题讨论】:

  • 这不是 DI 的工作方式。如果您希望 DI 创建您的对象,那么您不能自己直接调用构造函数(换句话说,避免使用 new 关键字)。如果您不熟悉 DI 概念,我强烈建议您观看 this video
  • new Whatever() 不是 DI。话虽如此,您不能在 Main 中使用 DI,因为这实际上是您运行的应用程序的第一件事。只有稍后 DI 才可用。
  • 当前状态下的问题不完整,因此不清楚。您能否重新格式化问题,以便我们更清楚地了解当前问题以及您实际上想要做什么?请参阅How to Ask 页面以获得澄清此问题的帮助。

标签: c# .net dependency-injection .net-core


【解决方案1】:

你可以这样做,假设你正确地注入了你的服务,并且不确定这是否是一个好主意,但是......

public static void Main(string[] args)
{
    var builder = CreateWebHostBuilder(args);
    var host = builder.Build(); 
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        var aws = services.GetService<AwsConfigurationBuilder>();

    }

【讨论】:

    【解决方案2】:

    任何依赖注入应用程序的起点都称为组合根。组合根是我们定义应用程序的所有映射的地方。松散地在抽象和具体之间建立映射。

    一旦定义了这个映射,对象创建就会移交给 DI 框架。 DI 框架然后遍历这些映射并为我们创建对象。

    @Mark Seemann 在他关于 DI 的开创性著作中给出的一个很好的类比是将您的代码想象成一个小孩。那个孩子是不允许打开冰箱的。现在,如果孩子想吃东西,他会问他妈妈。 DI 框架是知道冰箱里有什么以及如何为孩子提供食物的妈妈。

    【讨论】:

      【解决方案3】:

      ,您不能在 Main 方法中应用它,因为这是您的应用程序的入口点(并且它是静态方法,而不是构造函数)。

      您还通过创建一个新对象 (new ConfigBuilder) 来实例化该类,这不是您应该使用依赖注入的方式。

      您正在使用 ASP .NET 核心。您的依赖项的连接在 ConfigureServices(IServiceCollection services) after which 中完成,您可以使用依赖项。例如,通过在 Controller 构造函数中指定所需的依赖项(接口和/或类)。

      您可以在这里找到更深入的解释:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 2016-05-22
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        相关资源
        最近更新 更多