chr*_*pec 9 c# asp.net-mvc dependency-injection autofac lifetime-scoping
我正在使用带有MVC4附加组件的Autofac IoC容器,该附加组件提供InstancePerHttpRequest生命周期范围.但是在我的项目中,我有web,web-api和后台工作线程.在下面的示例中,我假设InstancePerHttpRequest范围在不是源自Web请求时并不重要.
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>()
.InstancePerHttpRequest()
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能做类似下面的例子并让容器选择最合适的生命周期范围?
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>()
.InstancePerHttpRequest()
.InstancePerApiRequest()
.InstancePerDependency();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我打算发生的是,如果请求来自Web请求,那么它将选择InstancePerHttpRequest范围,如果它来自webApi请求,它将选择InstancePerApiRequest范围,如果它被应用程序工作线程使用,它将使用InstancePerDependency范围?
任何想法,如果这或类似的东西是可能的?
谢谢
Tra*_*lig 11
这个问题与这些问题有一些相当重叠:
你会想要检查一些想法.
简短的回答是:这种东西不支持开箱即用.你需要做一些事情.
选项:您可以为后台线程使用不同的容器.这不允许您共享应用程序级单例,但这对您的应用程序可能没问题.
选项:您可以在容器外创建两个生命周期范围,并在调用时执行不同的注册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);
Run Code Online (Sandbox Code Playgroud)
如果你真的想要使用这个选项,你可以实现一个自定义IContainer,它可以检测它所在的上下文并从适当的嵌套范围中解析出来.这就是多租户Autofac支持的工作方式.然而,这是一个更复杂的解决方案,所以我不打算在这里写出来.有关示例,请查看Autofac源以获取多租户支持.
选项:您可以使用"最小公分母"之类的注册像InstancePerDependency或InstancePerLifetimeScope并跳过具有用于应用程序的不同部分的寿命有所不同的概念.
请注意,就目前而言,从技术上讲,在内部,什么InstancePerHttpRequest和InstancePerWebApiRequest做之间没有区别.它们都归结为完全相同的东西,并且可以有效地互换.(我不能保证永远都是这样,但我不知道为什么需要改变.)
| 归档时间: |
|
| 查看次数: |
5541 次 |
| 最近记录: |