Вы можете создать два интерфейса
interface IGenerateCsv : IGenerateFile{}
interface IGenerateTxt: IGenerateFile{}
, а затем зарегистрировать их у своего провайдера DI:
public static ServiceProvider Build()
{
var services = new ServiceCollection()
.AddTransient<IReadFile, ReaFile>()
.AddTransient<IWriteFile, WriteFile>()
.AddTransient<IGenerateCsv ,GenerateCsv>()
.AddTransient<IGenerateTxt,GenerateTxt>()
.BuildServiceProvider();
return services;
}
Затем вы можете создать другой класс, который имеет оба экземпляра и решает, какой из них вызвать.Затем внедрите этот класс в своего потребителя.
enum OutputType
{
Csv,
Text
}
interface IFileGenerator
{
void GenerateFile(OutputType outputType);
}
class FileGenerator : IFileGenerator
{
// inject both or your file services into the constructor
public void GenerateFile(OutputType outputType)
{
switch(outputType)
{
// call the correct service here
}
}
Затем зарегистрируйте IFileGenerator
public static ServiceProvider Build()
{
var services = new ServiceCollection()
.AddTransient<IReadFile, ReaFile>()
.AddTransient<IWriteFile, WriteFile>()
.AddTransient<IGenerateCsv ,GenerateCsv>()
.AddTransient<IGenerateTxt, GenerateTxt>()
.AddTransient<IFileGenerator, FileGenerator>()
.BuildServiceProvider();
return services;
}
И сделайте что-то подобное в своем классе потребителя:
class Consumer
{
private readonly IFileGenerator fileGenerator;
Consumer(IFileGenerator, fileGenerator)
{
this.fileGenerator = fileGenerator;
}
public void SomeMethod(string userInput)
{
switch(userInput)
{
case 1:
fileGenerator.GenerateFile(OutputType.Csv);
break;
case 2:
fileGenerator.GenerateFile(OutputType.Text);
break;
default:
break;
}
}
}
То естьпри условии, что у вас есть какой-то потребительский класс.Если вы просто работаете в методе Main, сделайте что-то вроде этого:
var serviceProvider = BuildDependencies.Build();
var fileGenerator = serviceProvider.GetService<IFileGenerator>();