Autofac + MVC3 + SignalR集成问题

时间:2013-05-30 05:00:08

标签: asp.net-mvc-3 signalr autofac

我已经使用Autofac和Autofac.Mvc3创建了一个用MVC3编写的现有工作Web应用程序。 我现在需要使用SignalR,所以我通过Nuget引入了Autofac.SignalR,它将Autofac.dll升级到3.0.0。

我现在注意到的是,当我尝试注册一个类型时,当我将InstancePerHttpRequest称为类型的生命周期时,我得到一个MissingMethodException。

作为练习,我尝试使用Autofac.Mvc4和Autofac.SignalR来完成当前应用程序的autofac注册在一个全新的MVC4应用程序中所做的事情,这似乎工作正常。

任何帮助将不胜感激

触发错误的示例行

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)'。

栈跟踪

  

at Autofac.Integration.Mvc.RegistrationExtensions.InstancePerHttpRequest [TLimit,TActivatorData,TStyle](IRegistrationBuilder`3注册)   在d:\ Code \ Onset \ DOT \ trunk \ DMS \ DMS.Website \ Global.asax.cs:第167行的DMS.Website.MvcApplication.Application_Start()中

1 个答案:

答案 0 :(得分:2)

我担心你在这里运气不好。 Autofac.SignalR是针对Autofac3 +构建的,但Autofac.Mvc3仅支持Autofac2.6。

根据Travis Illig

,似乎未来不会有任何支持
  

Autofac有一个保持最新的一般政策,因此在推出新的MVC版本时,旧版本不再获得直接支持。没有版本的Autofac 3.0支持MVC3,并且没有计划支持后端口功能。

因此,您要么升级到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字段。