我有一个名为ICompleteConsumer的接口,该接口只有一个方法,并且该接口有多个实现。
EX:
public class SampleClass1: ICompleteConsumer {
public async Task Complete(Model model) {
// do the work
}
}
public class SampleClass2: ICompleteConsumer {
public async Task Complete(Model model) {
// do the work
}
}
我这样在启动程序中注册了这些
services.AddScoped<ICompleteConsumer, SampleClass1>(),
services.AddScoped<ICompleteConsumer, SampleClass2>(),
我按如下方式注入这些依赖项
public class ConsumerHandlerService(string message) {
private readonly ICompleteConsumer completeConsumer;
public ConsumerHandlerService(ICompleteConsumer completeConsumer) {
this.completeConsumer = completeConsumer
}
switch (MessageType) {
case (MessageType .1) //I want SampleClass1 implementation to here
var model = JsonConvert.DeserializeObject < Model > (message);
await completeConsumer.complete(model);
break;
case (MessageType .2) // I want SampleClass2 implementation to here
var model = JsonConvert.DeserializeObject < Model > (message);
await completeConsumer.complete(model);
break;
}
}
如何使用.net核心DI实现此目标?
尝试一下:
private readonly IEnumerable<ICompleteConsumer> completeConsumers;
public ConsumerHandlerService(IEnumerable<ICompleteConsumer> completeConsumers) {
this.completeConsumers = completeConsumer
}
...
//Get the service you want basing on the messagetype, I guess
var completeConsumer = this.completeConsumers.First(c => c.Type == MessageType); // adjust this to your needs
switch (MessageType) {
case (MessageType .1) //I want SampleClass1 implementation to here
var model = JsonConvert.DeserializeObject < Model > (message);
await completeConsumer.complete(model);
break;
case (MessageType .2) // I want SampleClass2 implementation to here
var model = JsonConvert.DeserializeObject < Model > (message);
await completeConsumer.complete(model);
break;
}
您可以通过IEnumerable获得多项服务
public class ConsumerHandlerService
{
private readonly IEnumerable<ICompleteConsumer> _completeConsumers;
public ConsumerHandlerService(IEnumerable<ICompleteConsumer> completeConsumers)
{
this.completeConsumers = completeConsumers;
}
public void DoSomeWork(string message)
{
var model = JsonConvert.DeserializeObject<Model>(message);
foreach (var completeConsumer in completeConsumers)
{
completeConsumer.Complete(model);
}
}
}