Castle.Windsor生活方式取决于具体情况?

bev*_*qua 26 c# castle-windsor inversion-of-control quartz.net asp.net-mvc-3

我有一个Web应用程序,其中注册了许多组件.LifestylePerWebRequest(),现在我决定实现Quartz.NET,一个.NET作业调度库,它在不同的线程中执行,而不是Request线程.

因此,HttpContext.Current收益率null.IDbConnection到目前为止,我的服务,存储库和实例已被使用,.LifestylePerWebRequest()因为它使得在请求结束时更容易处理它们.

现在我想在两种情况下使用这些组件,在Web请求期间我希望它们不受影响,在非请求上下文中我希望它们使用不同的生活方式,我想我可以自己处理处理,但我该怎么办关于它根据当前背景选择组件的生活方式?

目前我注册服务(例如),像这样:

container.Register(
    AllTypes
        .FromAssemblyContaining<EmailService>()
        .Where(t => t.Name.EndsWith("Service"))
        .WithService.Select(IoC.SelectByInterfaceConvention)
        .LifestylePerWebRequest()
);
Run Code Online (Sandbox Code Playgroud)

我想我应该使用某种扩展方法,但我只是看不到它..

cuo*_*gle 24

您应该使用来自castleprojectcontrib的Hybrid Lifestyle.

混合生活方式实际上融合了两种潜在的生活方式:主要生活方式和次要生活方式.混合生活方式首先尝试使用主要的生活方式; 如果由于某种原因它不可用,它会使用次要的生活方式.这通常与PerWebRequest一起用作主要生活方式:如果HTTP上下文可用,则将其用作组件实例的范围; 否则使用次要生活方式.

  • 适用于Windsor 3到NuGet:http://nuget.org/packages/Castle.Windsor.Lifestyles/0.2.0-alpha1 (7认同)

Krz*_*mic 6

不要使用相同的组件.事实上,在大多数情况下,我已经看到"后台处理"在网络流程中开始时甚至没有意义.

根据评论进行阐述.

Web管道中的Shoehorning后台处理会影响您的体系结构,以便在EC2实例上节省一些$.我强烈建议再考虑一下,但我离题了.

我的陈述仍然有效,即使你将两个组件都放在Web过程中,它们是两个不同的上下文中使用的两个不同的组件,应该这样对待.