是否有正确的方式来声明我的服务,而不是:
services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], new Logger(Configuration["..."])));
我想避免宣布&#34;新的记录器&#34; 2次。
编辑:目录服务也在构造函数中使用字符串。
public CatalogService(ILogger logger, string path)
{
}
和
public Logger(string value)
{
}
答案 0 :(得分:3)
这应该有效:
CatalogService
在public class CatalogService(ILogger logger) {
...
}
课程中会有类似的内容:
CatalogService
由于您已经注册了ILogger的实现,IOC将自动创建一个要在new Configuration
类中使用的实例。
编辑:根据您的版本,每次都无需注入IConfiguration
。只需注册services.AddSingleton<IConfiguration>(Configuration);
services.AddTransient<ILogger, Logger>()
services.AddTransient<ICatalogService, CatalogService>()
的实施,它将在需要时自动注入。我没有测试过,但应该是这样的:
seekbar
顺便说一句,this link可以帮到你。
答案 1 :(得分:1)
您应尽可能使用IOption<T>
模式,有关详细信息,请参阅the documentation。
如果您无法使用IOptions<T>
模式(即在第三方库中定义的记录器或不支持此模式的旧库),则可以解析记录器在工厂方法。
services.AddTransient<ILogger>(provider => new Logger(Configuration["..."]));
services.AddTransient<ICatalogService>(provider => new CatalogService(Configuration["..."], provider.GetService<ILogger>()));
这样,记录器将从先前配置的配置中解析出来。这就是将provider
传递给工厂方法的原因。