【问题标题】:DI multiple implementation on single interface单个接口上的 DI 多重实现
【发布时间】:2019-03-04 01:50:36
【问题描述】:

我在一个接口上有多个具体实现。我已将其注册到 ASP.NET 核心 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&lt;MessageType, IMessageService&gt; serviceAccessor 注入构造函数

当我请求具体实现时serviceAccessor(MessageType.Sms) 抛出异常

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

出了什么问题?

【问题讨论】:

  • 您使用的是哪个 DI 容器?
  • ASP.NET Core 默认 DI 容器
  • 请发布MCVE 和完整的堆栈跟踪。

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


【解决方案1】:

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

对于接口的多种实现。我认为会更好

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

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 2021-05-02
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多