C# Unity Dependency Injection—MVC 5 web应用程序中每个http请求生存期的问题管理

C# Unity Dependency Injection—MVC 5 web应用程序中每个http请求生存期的问题管理,c#,asp.net-mvc,dependency-injection,asp.net-mvc-5,unity-container,C#,Asp.net Mvc,Dependency Injection,Asp.net Mvc 5,Unity Container,我试图实现每个HTTP请求的实例生命周期(在Unity DI中)。但是,当unity尝试注册实例时,我不断收到错误:“PerRequestLifetimeManager只能在HTTP请求的上下文中使用。此错误的可能原因是在非ASP.NET应用程序上使用lifetime manager,或者在与相应同步上下文不关联的线程中使用它。” 我在UnityMvcActivator.cs中注册了UnityPerRequestHttpModule,如下所示 public static void Start()

我试图实现每个HTTP请求的实例生命周期(在Unity DI中)。但是,当unity尝试注册实例时,我不断收到错误:“PerRequestLifetimeManager只能在HTTP请求的上下文中使用。此错误的可能原因是在非ASP.NET应用程序上使用lifetime manager,或者在与相应同步上下文不关联的线程中使用它。”

我在UnityMvcActivator.cs中注册了UnityPerRequestHttpModule,如下所示

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));
        }
publicstaticvoidstart()
{
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType().First());
FilterProviders.Providers.Add(新的UnityFilterAttributeFilterProvider(UnityConfig.Container));
DependencyResolver.SetResolver(新的UnityDependencyResolver(UnityConfig.Container));
//TODO:如果要使用PerRequestLifetimeManager,请取消注释
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
}
这就是我的UnityConfig.cs的样子

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());
        }
公共静态无效注册表类型(IUnityContainer容器)
{
//TODO:在此处注册类型的映射。
RegisterInstance(新的oittimeseetdbcontextfactory(),新的PerRequestLifetimeManager());
RegisterInstance(新的UserContext(container.Resolve()),新的PerRequestLifetimeManager());
}

对每个解析实例使用
注册表类型

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<OITTimeSheetDBContextFactory>(new PerRequestLifetimeManager());
    container.RegisterType<UserContext>(new PerRequestLifetimeManager());
}
公共静态无效注册表类型(IUnityContainer容器)
{
RegisterType(新PerRequestLifetimeManager());
RegisterType(新PerRequestLifetimeManager());
}

RegisterInstance
将有效地定义一个单例,并将始终返回对象的同一实例

对于每个解析实例使用
RegisterType

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<OITTimeSheetDBContextFactory>(new PerRequestLifetimeManager());
    container.RegisterType<UserContext>(new PerRequestLifetimeManager());
}
公共静态无效注册表类型(IUnityContainer容器)
{
RegisterType(新PerRequestLifetimeManager());
RegisterType(新PerRequestLifetimeManager());
}

RegisterInstance
将有效地定义一个单例,并始终返回对象的相同实例

谢谢!这是有道理的。成功了。我必须为每种类型创建单独的解析器,否则它将不接受。谢谢!这是有道理的。成功了。我必须为每种类型创建单独的解析器,否则它将无法接受。