我有两个服务实现了相同的接口.在回答How to register multiple implementations of the same interface in Asp.Net Core?之后,我简化了代码,

Interface:

public interface ICheckService
{
    Method1();
    Task Method2();
}

CheckerService:

public class CheckerService : ICheckService
{
    private readonly DapperContext _context;
    private readonly ILogger<CheckerService> _logger;

    public CheckerService(DapperContext context,ILogger<CheckerService> logger)
    {
        _logger = logger;
        _context = context;
    }
}

DesignerService:

public class DesignerService : ICheckService
{
    private readonly DapperContext _context;
    private readonly ILogger<DesignerService> _logger;

    public DesignerService(DapperContext context,ILogger<DesignerService> logger)
    {
        _logger = logger;
        _context = context;
    }
}

在我的Startup.cs文件中:

public delegate ICheckService ServiceResolver(string key);
...
services.AddScoped<ICheckService, DesignerService>();
services.AddScoped<ICheckService, CheckerService>();
services.AddScope<ServiceResolver>(serviceProvider => key =>
{
switch (key)
{
    case "DesignerService":
        return serviceProvider.GetService<DesignerService>();

    case "CheckerService":
        return serviceProvider.GetService<CheckerService>();

    default:
        throw new KeyNotFoundException();
}
});

Controller:强中

private readonly ICheckService _checklistService;

public DesignerController(ServiceResolver serviceAccessor)
{
    _checklistService = serviceAccessor("DesignerService");
}

但在启动代码后,我发现返回的服务是null.但是如果我删除switch 代码并将控制器构造函数更改为

public DesignerController(ICheckService checkService)
{
    _checklistService = checkService;
}

一切都很好.

有人能告诉我我哪里做错了吗?谢谢

推荐答案

请改为进行以下注册:

services.AddScoped<DesignerService>();
services.AddScoped<CheckerService>();

请注意,DesignerServiceCheckerService都不再由它们的接口注册,而是由它们的具体类型注册.这是必要的,因为您需要通过它们的具体类型来请求它们.

Csharp相关问答推荐

当打印一行x个项目时,如何打印最后一行项目?

如何使用Unity和MRTK3将手网添加到Hololens 2应用程序中

无法通过绑定禁用条目

在允许溢出的情况下将小数转换为长

TCPClient阅读流

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

BlockingCollection T引发意外InvalidOperationException

C#中Java算法的类似功能

N层解决方案上的依赖注入-删除样板

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

当使用Dapper映射DBNull时,我可以抛出异常吗?

使用Blazor WebAssembly提高初始页面加载时间的性能

如何对特定异常使用Polly重试机制?

如何阻止可传递依赖项出现在项目中

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

当我在Git中暂存文件更改时,它们会消失

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

SendInput无法在C#中正确模拟键盘