Dependency injection ASP.NET核心和依赖项注入

Dependency injection ASP.NET核心和依赖项注入,dependency-injection,asp.net-core,Dependency Injection,Asp.net Core,除此之外,是否有适当的方式来声明我的服务: services.AddTransient<ILogger>(provider => new Logger(Configuration["..."])); services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], new Logger(Configuration["..."]))); 及 这

除此之外,是否有适当的方式来声明我的服务:

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], new Logger(Configuration["..."])));

这应该起作用:

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]))
services.AddTransient<ICatalogService, CatalogService>();
由于您已经注册了ILogger的实现,IOC将自动创建一个实例以在
CatalogService
类中使用

编辑:基于您的版本,无需每次都注入新的配置。只需为您的
i配置注册实现
,它将在需要时自动注入。我没有测试过,但应该是这样的:

public class CatalogService(ILogger logger) {
...
}
services.AddSingleton<IConfiguration>(Configuration);
services.AddTransient<ILogger, Logger>()
services.AddTransient<ICatalogService, CatalogService>()
services.AddSingleton(配置);
services.AddTransient()
services.AddTransient()
顺便说一下,我可以帮你。

这应该可以:

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]))
services.AddTransient<ICatalogService, CatalogService>();
由于您已经注册了ILogger的实现,IOC将自动创建一个实例以在
CatalogService
类中使用

编辑:基于您的版本,无需每次都注入新的配置。只需为您的
i配置注册实现
,它将在需要时自动注入。我没有测试过,但应该是这样的:

public class CatalogService(ILogger logger) {
...
}
services.AddSingleton<IConfiguration>(Configuration);
services.AddTransient<ILogger, Logger>()
services.AddTransient<ICatalogService, CatalogService>()
services.AddSingleton(配置);
services.AddTransient()
services.AddTransient()

顺便说一句,它可以帮助您。

您应该尽可能使用
IOption
模式,有关更多信息,请参阅

如果无法使用
IOptions
模式(即在第三方库或不支持此模式的传统库中定义的记录器),则可以在工厂方法中解析记录器

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>()));
services.AddTransient(provider=>newlogger(配置[“…”]);
services.AddTransient(provider=>newcatalogservice(配置[“…”],provider.GetService());

通过这种方式,将从先前配置的配置中解析记录器。这就是将
提供程序
传递到工厂方法的原因。

您应该尽可能使用
IOption
模式,请参阅以了解更多信息

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>()));
如果无法使用
IOptions
模式(即在第三方库或不支持此模式的传统库中定义的记录器),则可以在工厂方法中解析记录器

services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>()));
services.AddTransient(provider=>newlogger(配置[“…”]);
services.AddTransient(provider=>newcatalogservice(配置[“…”],provider.GetService());

通过这种方式,将从先前配置的配置中解析记录器。这就是将
提供程序
传递到工厂方法的原因。

对不起,我的问题不够精确。我补充说precsions@Tim:分别注册您的
配置
。您的意思是使用IOOptions模式?对不起,我的问题不够精确。我补充说precsions@Tim:分别注册您的
配置
。您的意思是使用IOOptions模式?看起来很棒,我不知道!看起来很棒,我不知道!
services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>()));