.NET Core Main()中的依赖项注入不起作用

时间:2019-11-20 16:38:38

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

我有一个类,该类在.NET Core Web API(Main())的netcoreapp2.2方法中实例化,用于检索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)

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

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方法中是否不可能进行依赖注入?

3 个答案:

答案 0 :(得分:1)

任何依赖注入应用程序的起点都称为依赖根。依赖关系根是我们定义应用程序所有连接的地方。哪个抽象指向哪个具体。

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

您可以执行此操作,前提是您正确注入了服务,并且不确定这是否是一个好主意,但是...

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

    }