在单个接口上实现DI多重实现

时间:2018-09-28 05:40:45

标签: c# asp.net asp.net-core dependency-injection

我在一个界面上有多个具体实现。我已经将其注册到ASP.NET core DI中,如下所示:

services.AddTransient<EmailService>();
services.AddTransient<SmsService>();
services.AddTransient<Func<MessageType, IMessageService>>(serviceProvider => key =>
{
    switch (key)
    {
        case MessageType.Email:
            return serviceProvider.GetService<EmailService>();
        case MessageType.Sms:
            return serviceProvider.GetService<SmsService>();
        default:
            throw new KeyNotFoundException();
    }
});

然后我将Func<MessageType, IMessageService> serviceAccessor注入构造函数

当我请求特定实现serviceAccessor(MessageType.Sms)时引发异常

  

激活的事件持续时间线程异常抛出:   中的“ System.ObjectDisposedException”   Microsoft.Extensions.DependencyInjection.dll(“无法访问   处理对象。”)引发异常:“ System.ObjectDisposedException”   在Microsoft.Extensions.DependencyInjection.dll中(“无法访问   处置的对象。”)超链接:激活历史记录   调试8.97秒[428]   WorkPool-Session#2:Connection(3a5aaef7-e40f-4607-9d12-eacbd0dd5f6d,amqp:// localhost:5672)

问题是什么?

1 个答案:

答案 0 :(得分:2)

由于实现类中的问题是调用了IServiceProvider,该IServiceProvider将在DI的工厂之后处理。如果我在.Net Core上遇到过同样的问题,也许这是最新的问题。

并用于接口的多种实现。我认为更好

Interface IMessage<T> 
Class MailMessage : IMessage<MessageType>
Services.AddTransient<IMessage<MessageType>, MailMessage>()