Search code examples
c#asp.net-mvcdependency-injectionasp.net-mvc-5unity-container

Unity Dependency Injection - issue managing per http request lifetime in MVC 5 web application


I'm trying to implement lifetime of my instances (in Unity DI) per HTTP request. But I keep getting the error when unity is trying to register instance: "The PerRequestLifetimeManager can only be used in the context of an HTTP request. Possible causes for this error are using the lifetime manager on a non-ASP.NET application, or using it in a thread that is not associated with the appropriate synchronization context."

I have UnityPerRequestHttpModule registered in UnityMvcActivator.cs as shown below

public static void Start() 
        {
            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));

            // TODO: Uncomment if you want to use PerRequestLifetimeManager
            Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
        }

This is how my UnityConfig.cs looks like

public static void RegisterTypes(IUnityContainer container)
        {
            // TODO: Register your type's mappings here.
            container.RegisterInstance<OITTimeSheetDBContextFactory>(new OITTimeSheetDBContextFactory(), new PerRequestLifetimeManager());
            container.RegisterInstance<UserContext>(new UserContext(container.Resolve<OITTimeSheetDBContextFactory>()), new PerRequestLifetimeManager());
        }

Solution

  • Use RegisterType for Per Resolve instancing:

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<OITTimeSheetDBContextFactory>(new PerRequestLifetimeManager());
        container.RegisterType<UserContext>(new PerRequestLifetimeManager());
    }
    

    RegisterInstance will effectively define a singleton and will always return the same instance of the object