【问题标题】:DI Chaining with .NET 6 Generic Host.NET 6 通用主机的 DI 链接
【发布时间】:2022-08-19 01:38:43
【问题描述】:

我正在尝试在 .NET 6 中编写 Windows 服务(第一次尝试)。我已经能够很好地设置项目,但是当我尝试链接依赖项时遇到了问题。因此,我的构造函数将设置为这样的(Worker 添加为 HostedService,其他为 Singleton):

public class Settings
{
    public Settings(){}
}
public class Class1
{
    private readonly ILogger<Class1> _Logger;
    private readonly Settings _Settings;

    public Class1(ILogger<Class1> logger, Settings settings)
    {
        _Logger = logger;
        _Settings = settings;
    }
}
public class Class2
{
    private readonly ILogger<Class2> _Logger;
    private readonly Settings _Settings;

    public Class2(ILogger<Class2> logger, Settings settings)
    {
        _Logger = logger;
        _Settings = settings;
    }
}
public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _Logger;
    private readonly Settings _Settings;
    private readonly Class1 _Class1;
    private readonly Class2 _Class2;

    public Worker(ILogger<Worker> logger, Settings settings, Class1 class1, Class2 class2)
    {
        _Logger = logger;
        _Settings = settings;
        _Class1 = class1;
        _Class2 = class2;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _Logger.LogInformation(\"Worker running at: {time}\", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}
var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>()
            .AddSingleton<Settings>()
            .AddSingleton<Class1>()
            .AddSingleton<Class2>()
    })
    .Build();

await host.RunAsync();

现在,当它尝试解决依赖关系时,我收到以下错误消息:

验证服务描述符 \'ServiceType: Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: DI.Worker\' 时出错:找不到适合类型 \'DI.Class1\' 的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。

我去尝试按照documentation 中列出的步骤进行操作,但我得到了同样的错误。我想我错过了一些东西,但我不知道是什么。

  • 这里没有足够的细节。向我们展示更多关于Class1 和实际代码的信息,因为您在此处显示的内容永远无法编译。还要展示你是如何将所有这些添加到 DI 中的。
  • 您是否在 DI 中注册了SettingsClass1、...? serviceCollection.AddSingleton&lt;Settings&gt;(); serviceCollection.AddSingleton&lt;Class1&gt;(); ... 之类的东西?
  • 我添加了完整的实现

标签: .net dependency-injection


【解决方案1】:

在我的实际应用程序中,我并没有为我的所有服务使用接口,而是将它们具体添加。至于文档中的示例,这些类是内部的而不是公共的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2021-08-13
    • 1970-01-01
    • 2012-06-11
    • 2015-05-16
    相关资源
    最近更新 更多