首页 > 解决方案 > 对于 .NET Core 中的“依赖关系中的依赖关系”,您应该遵循什么模式?

问题描述

考虑以下:

    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-patternsasp.net-coredependency-injection

解决方案


据我所知,您的依赖项中没有任何“奇怪”方式的依赖项......

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

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

推荐阅读