DI множественная реализация на одном интерфейсе - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть несколько конкретных реализаций на одном интерфейсе.Я зарегистрировал это в DI ядра ASP.NET, как показано ниже

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.97s [428] WorkPool-Session # 2: соединение (3a5aaef7-e40f-4607-9d12-eacbd0dd5f6d, amqp: // localhost: 5672)

в чем проблема?

1 Ответ

0 голосов
/ 28 сентября 2018

Проблема в том, что в вашем классе реализации был вызов IServiceProvider, который будет расположен после фабрики DI.Может быть, это проблема последней версии, если .Net Core я столкнулся с тем же здесь.

И для нескольких реализаций интерфейса.Думаю лучше будет

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