我有一个类,该类在.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
方法中是否不可能进行依赖注入?
答案 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>();
}