.NET Core中“依赖关系中的依赖关系”应遵循的模式是什么?

问题描述 投票:0回答:1

考虑以下:

    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。

这样做的预期机制是什么 - 或者我应该考虑采用完全不同的模式吗?

c# design-patterns asp.net-core dependency-injection
1个回答
1
投票

从我所知道的,你的依赖关系中没有任何依赖,以任何“奇怪”的方式......

您需要做的就是为每个服务注册实现,如下所示:

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.