Ваша конфигурация отличная, и все должно работать нормально, кроме основного контроллера ASP.net.
Контроллеры в ядре ASP.net создаются не Autofac
, а byb ASP.net core:
По умолчанию ASP.NET Core разрешает параметры контроллера из контейнерано на самом деле не разрешает контроллер из контейнера.Обычно это не проблема, но это означает:
жизненный цикл контроллера обрабатывается платформой, а не время жизни запроса. Жизненный цикл параметров конструктора контроллера обрабатывается временем жизни запроса. Специальная проводка, которую вы могли выполнить при регистрации контроллера (например, настройка ввода свойств), не будет работать.Вы можете изменить это, указав
AddControllersAsServices()
при регистрации MVC в коллекции сервисов.Это автоматически зарегистрирует типы контроллеров в
IServiceCollection
при вызове
builder.Populate(services)
.>>
http://autofac.readthedocs.io/en/latest/integration/aspnetcore.html#controllers-as-services
Все, что вам нужно сделать, это позвонить AddControllersAsServices
// Add controllers as services so they'll be resolved.
services.AddMvc().AddControllersAsServices();
Кстати, даже если ваш код работает, не рекомендуется регистрироватьодин и тот же сервис несколько раз и полагаться на порядок по умолчанию.
builder.RegisterType<PostalServiceSender>()
.Keyed<ISender>("postal");
builder.RegisterType<EmailNotifier>()
.Keyed<ISender>("email")
.InstancePerLifetimeScope();
builder.RegisterType<DefaultSender>()
.As<ISender>()
.InstancePerLifetimeScope();
и ваш контроллер вот так:
builder.RegisterType<ShippingController>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveNamed<ISender>("postal")))
.InstancePerLifetimeScope();
builder.RegisterType<CustomersController>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(ISender),
(pi, ctx) => ctx.ResolveNamed<ISender>("email")))
.InstancePerLifetimeScope();