在我的安装程序类中,我有以下代码(在Visual Studio中使用Autofac和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
我收到错误说
类型&#39; Autofac.Core.DependencyResolutionException&#39;的例外情况发生在Autofac.dll但未在用户代码中处理
附加信息:没有标记匹配的范围&#39; AutofacWebRequest&#39;从请求实例的范围中可见。这通常表示SingleInstance()组件(或类似场景)正在请求注册为每HTTP请求的组件。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求
我该如何解决这个问题?
答案 0 :(得分:0)
您的IUserLoginStore
服务正在注册为InstancePerRequest
,这意味着它只能在请求的上下文中解析。即生命周期范围标记为&#39; AutofacWebRequest&#39;。
AutoFac会自动创建一个新的生命周期范围,标记为&#39; AutofacWebRequest&#39;对于每个请求,因此在请求中解析的服务可以访问此标记范围。
我想象Startup.Auth
类在MVC应用程序的范围内运行,并且在任何特定请求之外。因此,它无法访问标记范围,因此无法访问异常No scope with a Tag matching 'AutofacWebRequest'
。
如果是这种情况,那么将IUserLoginStore
注册更改为InstancePerLifetimeScope
将允许其在Startup.Auth
课程中正确解析。
但是,这也会改变在请求中解析时始终获取应用程序作用域服务的行为。如果没有看到更多代码,我无法判断这是否是一个问题。
这是一个相关的问题,写得很好:Autofac - InstancePerHttpRequest vs InstancePerLifetimeScope
注意 - 确保已配置Asp.Net MVC以使用AutoFac进行依赖项解析,如AutoFac文档(https://code.google.com/p/autofac/wiki/MvcIntegration)中所述。
protected void Application_Start(){ var builder = new ContainerBuilder(); builder.RegisterControllers(typeof运算(MvcApplication).Assembly); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// Other MVC setup...