如何使用.NET CORE DI为同一接口注册多个实现

问题描述 投票:1回答:2

我有一个名为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实现此目标?

c# asp.net-core asp.net-web-api dependency-injection
2个回答
0
投票

尝试一下:

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;
 }

-1
投票

您可以通过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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.