Csharp/C#教程:注册时是否可以指定多个Autofac生命周期范围?分享


注册时是否可以指定多个Autofac生命周期范围?

我正在使用带有MVC4附加组件的Autofac IoC容器,该附加组件提供InstancePerHttpRequest生命周期范围。 但是在我的项目中,我有web,web-api和后台工作线程。 在下面的示例中,我假设InstancePerHttpRequest范围在不是源自Web请求时并不意味着什么。

builder.RegisterType().As() .InstancePerHttpRequest() 

我想知道是否有可能做类似下面的例子并让容器选择最合适的生命周期范围?

 builder.RegisterType().As() .InstancePerHttpRequest() .InstancePerApiRequest() .InstancePerDependency(); 

在这种情况下,我打算发生的是,如果请求来自Web请求,那么它将选择InstancePerHttpRequest范围,如果它来自webApi请求,它将选择InstancePerApiRequest范围,如果它被应用程序工作线程使用,它将使用InstancePerDependency范围?

任何想法,如果这或类似的东西是可能的?
谢谢

这个问题与这些问题有一些相当重叠:

你会想要检查一些想法。

简短的回答是:这种东西不支持开箱即用。 你需要做一些事情。

选项:您可以为后台线程使用不同的容器。 这不允许您共享应用程序级单例,但这对您的应用程序可能没问题。

选项:您可以在容器外创建两个生命周期范围,并在调用BeginLifetimeScope执行不同的注册。 这将允许您共享应用程序级单例,并为不同上下文中的相同组件具有不同的生命周期范围。 但是,管理注册要困难一些,并且您需要两个不同的服务定位器(例如, DependencyResolver ),因为每个逻辑上下文都需要从其自己的范围中解析。

 var builder = new ContainerBuilder(); builder.RegisterType().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() .As() .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() .As() .InstancePerHttpRequest()); var resolver = new AutofacDependencyResolver(webScope); DependencyResolver.SetResolver(resolver); 

如果您真的想要使用此选项,您可以实现一个自定义IContainer ,它可以检测它所在的上下文并从适当的嵌套范围中解析出来。 这就是多租户Autofac支持的工作方式。 然而,这是一个更复杂的解决方案,所以我不打算在这里写出来。 有关示例,请查看Autofac源以获取多租户支持。

选项:您可以使用InstancePerDependencyInstancePerLifetimeScope这样的“最小公分母”类型的注册,并跳过对应用程序的不同部分具有不同生命周期的概念。

请注意,就技术而言,在内部, InstancePerHttpRequestInstancePerWebApiRequest之间没有区别 。 它们都归结为完全相同的东西,并且可以有效地互换。 (我不能保证永远都是这样,但我不知道为什么需要改变。)

上述就是C#学习教程:注册时是否可以指定多个Autofac生命周期范围?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1002251.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐