我将 Autofac IoC 容器与 MVC4 附加组件一起使用,该附加组件提供 InstancePerHttpRequest 生命周期范围。然而,在我的项目中,我有 web、web-api 和后台工作线程。在下面的示例中,我假设 InstancePerHttpRequest 范围在不是源自 Web 请求时没有多大意义。
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>()
.InstancePerHttpRequest()
我想知道是否可以执行类似以下示例的操作并让容器选择最合适的生命周期范围?
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>()
.InstancePerHttpRequest()
.InstancePerApiRequest()
.InstancePerDependency();
在这种情况下,我打算发生的是,如果请求源自 Web 请求,那么它将选择 InstancePerHttpRequest 范围,如果它源自 webApi 请求,它将选择 InstancePerApiRequest 范围,如果它被应用程序工作线程使用,它将选择 InstancePerApiRequest 范围。使用 InstancePerDependency 范围?
如果这或类似的事情可能的话有什么想法吗?
Thanks
这个问题与这些问题有相当多的重叠:
- 在 asp.net mvc 3 中管理每个会话和请求的 AutoFac 生命周期范围
- 每个匹配生命周期范围的实例,默认情况下?
- Autofac - 生命周期和模块
- Autofac 生命周期和匹配生命周期范围内的默认提供程序
您需要检查这些内容以获取一些想法。
简短的回答是:这种事情不受开箱即用的支持。您需要执行以下几件事之一。
选项:您可以为后台线程使用不同的容器。这不允许您共享应用程序级单例,但这对于您的应用程序来说可能没问题。
选项:您可以在容器外创建两个生命周期范围,并作为调用的一部分进行不同的注册BeginLifetimeScope
.这将允许您共享应用程序级单例,并且在不同上下文中相同组件具有不同的生命周期范围。不过,管理注册有点困难,并且您需要两个不同的服务定位器(例如,DependencyResolver
)因为每个逻辑上下文都需要从其自己的范围内解析。
var builder = new ContainerBuilder();
builder.RegisterType<AppLevelSingleton>().SingleInstance();
var container = builder.Build();
// Create a nested lifetime scope for your background threads
// that registers things as InstancePerDependency, etc. Pass
// that scope to whatever handles dependency resolution on the thread.
var backgroundScope = container.BeginLifetimeScope(
b => b.RegisterType<DatabaseFactory>()
.As<IDatabaseFactory>()
.InstancePerDependency());
// Create a nested lifetime scope for the web app that registers
// things as InstancePerHttpRequest, etc. Pass that scope
// as the basis for the MVC dependency resolver.
var webScope = container.BeginLifetimeScope(
b => b.RegisterType<DatabaseFactory>()
.As<IDatabaseFactory>()
.InstancePerHttpRequest());
var resolver = new AutofacDependencyResolver(webScope);
DependencyResolver.SetResolver(resolver);
如果你真的想喜欢这个选项,你可以实现一个自定义IContainer
它可以检测它所在的上下文并从适当的嵌套范围解析事物。这就是多租户 Autofac 支持的工作原理。然而,这是一个更复杂的解决方案,所以我不打算在这里把所有内容都写出来。检查 Autofac 源以获取多租户支持的示例。
选项:您可以使用“最小公分母”类型的注册 like InstancePerDependency
or InstancePerLifetimeScope
并跳过应用程序的不同部分具有不同生命周期的概念。
请注意,现在,从技术上讲,在内部,没有什么区别InstancePerHttpRequest
and InstancePerWebApiRequest
do。它们都归结为完全相同的东西并且可以有效地互换。 (我不能保证它会永远如此,但我不知道为什么需要改变。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)