Я использую Ninject для загрузки нескольких модулей. Когда два модуля пытаются связать две разные реализации интерфейса, ninject выдает ошибку, запрещающую множественное связывание для службы.
Все остальные IoC-фреймворки, которые я использую (Unity, Windsor, Spring.net и т. Д.), Имеют возможность «регистрировать» несколько реализаций интерфейса.
Приведу пример из реальной жизни:
public class HealtMonitorEmailAlertServiceModule : StandardModule
{
public override void Load()
{
this.Bind<IAlertService>().To<EmailAlertService>();
}
}
public class HealtMonitorSmsAlertServiceModule : StandardModule
{
public override void Load()
{
this.Bind<IAlertService>().To<SmsAlertService>();
}
}
public class Program
{
static void Main()
{
var emailService = new HealtMonitorEmailAlertServiceModule();
var smsService = new HealtMonitorSmsAlertServiceModule();
IKernel kernel = new StandardKernel(emailService, smsService);
kernel.Get<IAlertService>()
}
}
Вышеупомянутое генерирует исключение, я бы ожидал, что он разрешит тип, зарегистрированный в последнем модуле для загрузки в ядро. Я пробовал точно такой же подход с использованием Autofac, и он работает так, как я ожидал.