MVC Web API AutoFac依赖注入

时间:2014-07-25 07:08:22

标签: c# asp.net-web-api dependency-injection autofac

在我的安装程序类中,我有以下代码(在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请求依赖项,从不从容器本身请求

我该如何解决这个问题?

1 个答案:

答案 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...