2014-07-25 112 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 –