I have 2 strategies named CompanySyncStrategy and ProjectSyncStrategy.
CompanySyncStrategy.cs
public class CompanySyncStrategy : ISyncStrategy
{
private readonly ICompanyService companyService;
public CompanySyncStrategy(ICompanyService companyService)
{
this.companyService = companyService;
}
public void Sync()
{
//sync code
}
}
ProjectSyncStrategy
public class ProjectSyncStrategy : ISyncStrategy
{
private readonly IProjectService projectService;
public ProjectSyncStrategy(IProjectService projectService)
{
this.projectService = projectService;
}
public void Sync()
{
//sync code
}
}
program.cs file looks like this
builder.Services.AddScoped<ICompanyService, CompanyService>();
builder.Services.AddScoped<IProjectService, ProjectService>();
builder.Services.AddScoped<ISyncContext, SyncContext>();
builder.Services.AddScoped<ISyncStrategy, CompanySyncStrategy>();
builder.Services.AddScoped<ISyncStrategy, ProjectSyncStrategy>();
builder.Services.AddSingleton<ISyncStrategyFactory, SyncStrategyFactory>();
when trying to get a strategy in runtime I get the following error from SyncStrategyFactory
System.InvalidOperationException: 'No service for type 'Strategy.Services.CompanySyncStrategy' has been registered.'
SyncStrategyFactory class looks like this
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<ProjectSyncStrategy>();
default:
throw new InvalidOperationException();
}
}
}
Can't I use dependency injection here? What am I doing wrong?