2013-05-30 67 views
1

我有一個使用Autofac和Autofac.Mvc3編寫的MVC3編寫的現有的,可用的Web應用程序。 我現在需要使用SignalR,所以我已經通過Nuget,Autofac.SignalR已經升級Autofac.dll到3.0.0。Autofac + MVC3 + SignalR集成問題

我現在注意到的是,當我試圖註冊一個類型時,當我調用InstancePerHttpRequest作爲類型的生存期時,我得到一個MissingMethodException。作爲一個練習,我嘗試了使用Autofac.Mvc4和Autofac.SignalR這個全新的MVC4應用程序來處理當前應用程序的autofac註冊,這看起來工作得很好。

任何幫助,將理解的是,觸發錯誤

builder.RegisterType<CompanyController>().InstancePerHttpRequest(); 
// or 
builder.Register(x => x.Resolve<ISessionFactory. 
    ().OpenSession()).InstancePerHttpRequest(); 

異常未找到

方法

例行:「Autofac.Builder.IRegistrationBuilder 3<!0,!1,!2> Autofac.Builder.IRegistrationBuilder 3。 InstancePerMatchingLifetimeScope(System.Object的)」。

堆棧跟蹤

在Autofac.Integration.Mvc.RegistrationExtensions.InstancePerHttpRequest [TLIMIT,TActivatorData,TStyle](IRegistrationBuilder`3註冊) 在DMS.Website.MvcApplication.Application_Start() d:\ Code \ Onset \ DOT \ trunk \ DMS \ DMS.Website \ Global.asax.cs:line 167

+1

恐怕你在這裏運氣不好。你不能在MVC3和Autofac中使用SignalR,因爲在MVC3中不支持Autofac3。另請參閱:http://stackoverflow.com/a/16719213/872395因此,您需要升級到MVC4,或者需要構建Autofac 3.0以上版本的Autofac.MVC3。 – nemesv

+0

我已經得出同樣的結論。你可以把它作爲答案嗎? – damienc88

+0

您可以改用'InstancePerLifetimeScope'。 – jgauffin

回答

2

恐怕您在這裏運氣不佳。 Autofac.SignalR是針對Autofac3 +構建的,但Autofac.Mvc3只支持Autofac2.6。

而且似乎不會有任何的支持在將來添加或者根據Travis Illig

Autofac具有保持電流,從而爲新的MVC版本都放出來的一般政策,舊版本停止獲取直接支持。沒有支持MVC3的Autofac 3.0版本,並且沒有計劃支持後端功能。

因此,您要麼升級到MVC4,要麼可以嘗試構建適合您需求的Autofac.MVC3自定義版本。

免責聲明:HACK警報使用它在您自己的風險:

所以,如果你不怕讓你的手髒了亂用Autofac的一點點反思,以「港」的幫助下,內部InstancePerHttpRequest與Autofac3 +

只需將此類添加到您的項目中,並確保您在註冊時使用此版本的InstancePerHttpRequest

public static class MyRegistrationExtensions 
{ 
    public static IRegistrationBuilder<TLimit, TActivatorData, TStyle> 
     InstancePerHttpRequest<TLimit, TActivatorData, TStyle>(
     this IRegistrationBuilder<TLimit, TActivatorData, TStyle> registration) 
    { 
     if (registration == null) 
      throw new ArgumentNullException("registration"); 
     var httpRequestTagField = 
       typeof(RequestLifetimeScopeProvider) 
       .GetField("HttpRequestTag", 
         BindingFlags.NonPublic | BindingFlags.Static) 
     return registration.InstancePerMatchingLifetimeScope(
        httpRequestTagField.GetValue(null)); 
    } 
} 

基本上這個方法做同樣的事情與原始版本,除了它需要反射訪問否則內部RequestLifetimeScopeProvider.HttpRequestTag字段。

+0

感謝您的全面回答。我們決定將該項目升級到MVC4,但我會牢記這一點。 – damienc88