我有两个策略,分别命名为CompanySyncStrategy项目同步策略.

CompanySyncStrategy.cs

public class CompanySyncStrategy : ISyncStrategy
    {
        private readonly ICompanyService companyService;

        public CompanySyncStrategy(ICompanyService companyService)
        {
            this.companyService = companyService;
        }

        public void Sync()
        {
            //sync code
        }
    }

项目同步策略

public class 项目同步策略 : ISyncStrategy
{
    private readonly IProjectService projectService;

    public 项目同步策略(IProjectService projectService)
    {
        this.projectService = projectService;
    }

    public void Sync()
    {
        //sync code
    }
}

Program.cs文件如下所示

builder.Services.AddScoped<ICompanyService, CompanyService>();
builder.Services.AddScoped<IProjectService, ProjectService>();

builder.Services.AddScoped<ISyncContext, SyncContext>();
builder.Services.AddScoped<ISyncStrategy, CompanySyncStrategy>();
builder.Services.AddScoped<ISyncStrategy, 项目同步策略>();
builder.Services.AddSingleton<ISyncStrategyFactory, SyncStrategyFactory>();

当try 在运行时获取策略时,我从SyncStrategyFactory得到以下错误

System.InvalidOperationException: 'No service for type 'Strategy.Services.CompanySyncStrategy' has been registered.'

SyncStrategy yFactory类如下所示

public class SyncStrategyFactory : ISyncStrategyFactory
    {
        private readonly IServiceProvider serviceProvider;

        public SyncStrategyFactory(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }

        public ISyncStrategy GetSyncStrategy(string strategyType)
        {
            switch (strategyType)
            {
                case "company":
                    return serviceProvider.GetRequiredService<CompanySyncStrategy>();
                case "project":
                    return serviceProvider.GetRequiredService<项目同步策略>();
                default:
                    throw new InvalidOperationException();
            }
        }
    }

我不能在这里使用依赖注入吗? 我做错了什么?

推荐答案

您的代码有两个问题:

1.使用接口注册的服务不能按实现类型进行解析.

2.:使用作用域生存期注册的服务通常不能在单例生存期服务please check this answer内被解析.考虑使用不同的生存期注册它们,或者在解析它们时创建一个作用域.

但是,如果您不想更改注册,这可能会奏效:

// service registrations
builder.Services.AddScoped<ISyncStrategy, CompanySyncStrategy>();
builder.Services.AddScoped<ISyncStrategy, ProjectSyncStrategy>();
builder.Services.AddSingleton<ISyncStrategyFactory, SyncStrategyFactory>();

// SyncStrategyFactory
public ISyncStrategy GetSyncStrategy(string strategyType)
{
    switch (strategyType)
    {
        case "company":
            using (var scope = serviceProvider.CreateScope())
            {
                return scope.ServiceProvider.GetServices<ISyncStrategy>().First(s => s is CompanySyncStrategy);
            }
        case "project":
            ...
        default:
            throw new InvalidOperationException();
    }
}

Csharp相关问答推荐

我们应该如何在IHostedService中使用按请求的GbContent实例?

ASP.NET核心结果.文件vs结果.流

始终保留数组中的最后N个值,丢弃最老的

用C#调用由缓冲区指针参数组成的C API

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

使用Orleans进行的单元测试找不到接口的实现

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

如何从ASP.NET核心MVC视图和Blazor传递数据

如何使用C#中的主构造函数功能使用多个构造函数?

MigraDoc文档

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

为什么我的用户界面对象移动到略低于实际目标?

System.NotSupportdException:流不支持读取

如何正确处置所有动态控件?

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

在Unity C#中按键点击错误的参数

.NET8支持Vector512,但为什么向量不能达到512位?

有没有更好的方法来使用LINQ获取整行的计算组

如果图表S批注包含使用LINQ的具有特定名称的批注,我如何签入C#

身份验证中间件如何处理多个方案