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());
}
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