2014-07-25 91 views
1

在我的设置类,我有以下代码(使用Autofac和Visual Studio中的MVC的Web API模板)在Startup.Auth类MVC的Web API AutoFac依赖注入

builder.RegisterType<CRMUserStore<IdentityUser>>().As<IUserLoginStore<IdentityUser>>() 
    .InstancePerRequest(); 

然后,我有以下

UserManagerFactory =() => new UserManager<IdentityUser>(
    DependencyResolver.Current.GetService<IUserLoginStore<IdentityUser>>()); 

这将返回null。后来,当我尝试,取代上述

UserManagerFactory =() => new UserManager<IdentityUser>(
    _container.Resolve<IUserLoginStore<IdentityUser>>()); //_container is IContainer 

我得到一个错误说

型“Autofac.Core.DependencyResolutionException”发生在Autofac.dll的一个例外,但在用户代码中没有处理

附加信息:从请求实例的作用域看不到具有与“AutofacWebRequest”匹配的标记的作用域。这通常表示按照Single-HTTP请求注册的组件正在通过SingleInstance()组件(或类似的场景)请求。在Web集成下,始终请求DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime的依赖关系,而不是从容器本身。

我该如何解决这个问题?

回答

0

您的IUserLoginStore服务正在注册为InstancePerRequest这意味着它只能从请求的上下文中解决。即标签为“AutofacWebRequest”的生命周期范围。

AutoFac会为每个请求自动创建一个标记为“AutofacWebRequest”的新生命周期范围,因此请求中解析的服务可以访问此标记的范围。 我想象一下Startup.Auth类正在MVC应用程序的范围内运行,并且没有任何特定的请求。因此它无法访问标记的范围,因此不能使用No scope with a Tag matching 'AutofacWebRequest'

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

但是,这也会改变在请求中解析时始终获取应用程序范围的服务的行为。没有看到更多的代码,我不知道这是否会成为问题。

这里是一个不错的书面记录一个相关的问题:Autofac - InstancePerHttpRequest vs InstancePerLifetimeScope

注意 - 确保你已经配置Asp.Net MVC作为AutoFac文档(https://code.google.com/p/autofac/wiki/MvcIntegration)中的描述使用AutoFac的依赖解析。

保护无效Application_Start(){ var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// Other MVC setup... 
+0

后,我注册Autofac当我尝试DependencyResolver.Current.GetType()。ToString()我得到 “System.Web.Mvc.DependencyResolver + DefaultDependencyResolver”它不应该是Autofac? – user3547774

+0

看起来您正在使用默认的Asp.Net Mvc依赖项解析器:http://msdn.microsoft.com/en-us/library/system.web.mvc.dependencyresolver(v=vs.118).aspx。您需要使用Asp.Net Mvc注册AutoFac,如下所示:https://code.google.com/p/autofac/wiki/MvcIntegration –