我正在使用一个使用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")
)
);
在我看来,这很有效,但是
每次调用Resolve时,我们还希望获得一个ShinyNewService的新实例,因此我认为也将其配置为InstancePerDependency
是很有意义的。
有人对这种方法有什么建议吗?我也在考虑标记的生存期范围,但没有设法提出完整的解决方案。欢迎任何输入,谢谢。