Я работаю с устаревшей кодовой базой, которая использует Autofac и регистрирует множество (если не все) зависимостей как PerRequest.
Мы разрабатываем новые функциональные возможности и хотели бы, чтобы новые сервисы разрешали свои зависимости индивидуально для каждого сервиса, а не для каждого запроса. Первоначальный сервис получается сервисным локатором через Resolve.
Какой оптимальный способ добиться этого с помощью Autofac?
Я полагаю, что Keyed Services могут помочь здесь. Вот пример конфигурации:
builder.RegisterType<Impl>().As<IDependency>().InstancePerLifetimeScope();
builder.RegisterType<Impl>().As<IDependency>().InstancePerDependency().Keyed<IDependency>("shinyNewService");
builder.RegisterAssemblyTypes(newServiceAssembly).AsClosedTypesOf(newServiceInterface).WithParameter
(
new ResolvedParameter
(
(pi, ctx) => pi.ParameterType == typeof(IDependency),
(pi, ctx) => ctx.ResolveKeyed<IDependency>("shinyNewService")
)
);
Кажется, работает в моем случае, но
мы также хотели бы получать новый экземпляр ShinyNewService каждый раз, когда вызывается Resolve, поэтому я думаю, что имеет смысл также настроить его на InstancePerDependency
.
Есть ли у кого-нибудь совет относительно этого подхода? Я также рассматривал помеченные области действия на всю жизнь, но не смог найти полное решение. Любой вклад приветствуется, спасибо.