考虑以下:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<ILogger, Logger>();
...
}
所以我显然想在我的控制器方法中使用一个日志类,如图所示,但我还有许多其他组件对他们来说很常见 - 所有这些组件都希望引用我的记录器。毕竟这是一个单身人士(我想这可能是反模式,但无论如何)。
我应该如何正确地在ConfigureServices方法中传递“依赖项中的依赖项”?我想我可以这样做,我想:
public void ConfigureServices(IServiceCollection services)
{
Logger l = new Logger();
services.AddSingleton<ILogger, Logger>((provider) =>
{
return l;
});
services.AddScoped<IFoo, Foo>((provider) =>
{
return new Foo(l);
});
...
}
我可以做那样的事情!但它看起来和感觉就像一个黑客。我确定我不应该像我这样在我的ConfigureServices方法中解析/制作实际的具体结构,但我不知道如何告诉我的Foo构造函数(比如我的控制器方法)依赖于ILogger。
这样做的预期机制是什么 - 或者我应该考虑采用完全不同的模式吗?
从我所知道的,你的依赖关系中没有任何依赖,以任何“奇怪”的方式......
您需要做的就是为每个服务注册实现,如下所示:
services.AddSingleton<ILogger, Logger>();
当这些行执行时,您可以在构造函数的定义中“请求”ILogger,框架将处理实例化(或不根据服务范围等)并将引用传递给您的调用。
这意味着,如果您的IFoo在其构造函数中“请求”ILogger,则只要您在ILogger提供程序之后注册IFoo服务提供程序,就不需要做任何棘手的事情来解决它。下面是一个简单的示例,其中Foo实现在构造函数中请求ILogger
public class Foo : IFoo
{
private readonly ILogger<Foo> _logger;
public Foo(ILogger<Foo> logger)
{
_logger = logger;
}
public Task WriteMessage(string message)
{
_logger.LogInformation("Foo.WriteMessage called. Message:{MESSAGE}", message);
return Task.FromResult(0);
}
}