Да, вы правы.
Модули служат только для разделения конфигурации на несколько независимых частей.Они никак не влияют на конфигурацию.Наличие модулей на самом деле такое же, как если бы вы объединили код всех модулей Load
методов в один метод конфигурации, а затем собрали контейнер.
В вашем случае ваш Module2
фактически отменяет регистрацию для IA
интерфейс от Module1
.
Мне также было интересно найти решение проблемы.Я пришел к следующему подходу:
Служба ключей
var key = new object();
builder.Register(c => new CA() { Name = "Two" }).Keyed<IA>(key);
builder.RegisterType<CB>().Named("Two", typeof(CB))
.WithParameter(new ResolvedParameter(
(pi, ctx) => pi.Type == typeof(IA),
(pi, ctx) => ctx.ResolveKeyed<IA>(key)
));
Плюсы:
Вы можете контролировать, какие IA
экземпляров будут* вводится в каждый модуль.
Против:
- Код довольно большой
- Он не делает
IA
компонент «внутренним» для модуля - другоеМодули все еще могут решить это, используя простой Resolve<IA>
.Модули не изолированы.
Надеюсь, это поможет
ОБНОВЛЕНИЕ
В некоторых случаях это может быть проще, и, откровенно говоря, более правильным сс точки зрения дизайна, чтобы сделать это так:
Регистрация делегата
builder.Register(ctx => new CB(new CA { Name = "Two" }))
.Named("Two", typeof(CB));
Плюсы:
- Вы не выставляетедля вашего модуля
CA
для других модулей
Против:
- Если
CA
и CB
имеют сложные зависимости и много параметров конструктора, вы 'Вы получите беспорядок построения кода - Если вам нужно использовать
CA
в нескольких местах внутри модуля, вам нужно будет найти способ избежать копирования-вставки
Экземпляры вложенных контейнеров
И еще один вариант - иметь независимый Container
внутри каждого модуля.Таким образом, все модули смогут иметь свои частные конфигурации контейнеров.Однако, AFAIK, Autofac не предоставляет никаких встроенных средств для того, чтобы каким-либо образом связать несколько Container
экземпляров.Хотя я полагаю, что реализовать это не должно быть очень сложно.