Castle.Windsor lifestyle depending on context?

asp.net-mvc-3, c#, castle-windsor, inversion-of-control, quartz.net

Solution

You should use Hybrid Lifestyle from castleprojectcontrib.

An hybrid lifestyle is one that actually blends two underlying lifestyles: a main lifestyle and a secondary lifestyle. The hybrid lifestyle first tries to use the main lifestyle; if it's unavailable for some reason, it uses the secondary lifestyle. This is commonly used with PerWebRequest as the main lifestyle: if the HTTP context is available, it's used as the scope for the component instance; otherwise the secondary lifestyle is used.

Problem

I have a web application where many components are registered using `.LifestylePerWebRequest()`, now I've decided to implement Quartz.NET, a .NET job scheduling library, which executes in separate threads, and not the Request thread. As such, `HttpContext.Current` yields `null`. My services, repositories, and `IDbConnection` were instanced so far using `.LifestylePerWebRequest()` because it made it easier to dispose of them when the requests ended. Now I want to use these components in both scenarios, during web requests I want them to remain unaffected, and in non-request contexts I want them to use a different Lifestyle, I figure I can handle the disposing myself, but how should I go about it for choosing a lifestyle for the components based on the current context? Currently I register services (for example), like this: ``` container.Register( AllTypes .FromAssemblyContaining<EmailService>() .Where(t => t.Name.EndsWith("Service")) .WithService.Select(IoC.SelectByInterfaceConvention) .LifestylePerWebRequest() ); ``` I figure I should be using some kind of extension method but I just don't see it..

Original source

Related problems