ASP.NET Core和依赖注入

时间:2016-10-11 13:40:48

标签: dependency-injection asp.net-core

是否有正确的方式来声明我的服务,而不是:

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)
{
}

2 个答案:

答案 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传递给工厂方法的原因。