Четыре варианта выполнения этого описаны в Документация по автозапуску :
Вариант 1: перепроектировать ваши интерфейсы
При запускев ситуации, когда у вас есть куча компонентов, которые реализуют идентичные сервисы, но они не могут обрабатываться одинаково, это, как правило, является проблемой проектирования интерфейса.
С точки зрения объектно-ориентированной разработки вам нужны ваши объектыпридерживаться принципа подстановки Лискова и такого рода разрывов.
При некотором перепроектировании интерфейса вам не нужно «выбирать зависимость по контексту» - вы используете типы для дифференциации и позволяете автоматическиВолшебство перехвата происходит во время разрешения.
Если у вас есть возможность влиять на изменения в вашем решении, это рекомендуемый вариант.
Вариант 2: Изменение регистраций
Можно вручную связать соответствующий тип с потребляющим компонентом следующим образом:
var builder = new ContainerBuilder();
builder.Register(ctx => new ShippingProcessor(new PostalServiceSender()));
builder.Register(ctx => new CustomerNotifier(new EmailNotifier()));
var container = builder.Build();
// Lambda registrations resolve based on the specific type, not the
// ISender interface.
builder.Register(ctx => new ShippingProcessor(ctx.Resolve<PostalServiceSender>()));
builder.Register(ctx => new CustomerNotifier(ctx.Resolve<EmailNotifier>()));
var container = builder.Build();
OПункт 3: Использование служб с ключами
builder.RegisterType<PostalServiceSender>()
.As<ISender>()
.Keyed<ISender>("order");
builder.RegisterType<EmailNotifier>()
.As<ISender>()
.Keyed<ISender>("notification");
builder.RegisterType<ShippingProcessor>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveKeyed<ISender>("order")));
builder.RegisterType<CustomerNotifier>();
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveKeyed<ISender>("notification")));
Вариант 4: Использование метаданных
builder.RegisterType<PostalServiceSender>()
.As<ISender>()
.WithMetadata("SendAllowed", "order");
builder.RegisterType<EmailNotifier>()
.As<ISender>()
.WithMetadata("SendAllowed", "notification");
builder.RegisterType<ShippingProcessor>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<IEnumerable<Meta<ISender>>>()
.First(a => a.Metadata["SendAllowed"].Equals("order"))));
builder.RegisterType<CustomerNotifier>();
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.Resolve<IEnumerable<Meta<ISender>>>()
.First(a => a.Metadata["SendAllowed"].Equals("notification"))));