C# MVC Web API AutoFac依赖项注入

C# MVC Web API AutoFac依赖项注入,c#,asp.net-web-api,dependency-injection,autofac,C#,Asp.net Web Api,Dependency Injection,Autofac,在我的设置类中,我使用Autofac和Visual Studio中的MVC Web API模板编写了以下代码 builder.RegisterType<CRMUserStore<IdentityUser>>().As<IUserLoginStore<IdentityUser>>() .InstancePerRequest(); 然后在Startup.Auth类中,我有以下内容 UserManagerFactory = () => n

在我的设置类中,我使用Autofac和Visual Studio中的MVC Web API模板编写了以下代码

builder.RegisterType<CRMUserStore<IdentityUser>>().As<IUserLoginStore<IdentityUser>>()
    .InstancePerRequest();
然后在Startup.Auth类中,我有以下内容

UserManagerFactory = () => new UserManager<IdentityUser>(
    DependencyResolver.Current.GetService<IUserLoginStore<IdentityUser>>());
这将返回null。然后当我尝试代替上面的

UserManagerFactory = () => new UserManager<IdentityUser>(
    _container.Resolve<IUserLoginStore<IdentityUser>>()); //_container is IContainer
我听到一个错误说

Autofac.dll中出现“Autofac.Core.DependencyResolutionException”类型的异常,但未在用户代码中处理

其他信息:从请求实例的作用域中看不到标记与“AutofacWebRequest”匹配的作用域。这通常表示单实例组件或类似场景正在请求根据HTTP请求注册的组件。在web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身

如何修复此问题?

您的IUserLoginStore服务正在注册为InstancePerRequest,这意味着它只能在请求的上下文中进行解析。即标记为“AutofacWebRequest”的生存期范围

AutoFac会自动为每个请求创建一个标记为“AutofacWebRequest”的新生存期作用域,因此请求中解析的服务可以访问此标记的作用域。 我可以想象Startup.Auth类在MVC应用程序的范围内运行,并且在任何特定请求之外。因此,它无法访问标记的作用域,因此存在标记与“AutofacWebRequest”匹配的“无作用域”异常

如果是这种情况,那么将IUserLoginStore注册更改为InstancePerLifetimeScope将允许它在Startup.Auth类中正确解析

但是,这也会改变在请求内解析时的行为,以始终获得应用程序范围的服务。如果没有看到更多的代码,我无法判断这是否是一个问题

这里有一个相关的问题,写得很好:

注意-确保已将Asp.Net MVC配置为使用AutoFac进行依赖项解析,如AutoFac文档中所述

受保护的无效应用程序\u启动{ var builder=新的容器生成器; builder.registercontrollersTypeOfVCApplication.Assembly; var container=builder.Build; DependencyResolver.SetResolvernew AutofacDependencyResolver容器

// Other MVC setup...

在我尝试DependencyResolver.Current.GetType.ToString时注册Autofac后,我得到System.Web.Mvc.DependencyResolver+DefaultDependencyResolver,它不应该是Autofac吗?看起来您正在使用默认的Asp.Net Mvc依赖项解析程序:。您需要按如下方式向Asp.Net Mvc注册Autofac: