1

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

我现在注意到的是,当我尝试注册一个类型时,当我调用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.IRegistrationBuilder3.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:第 167 行

4

1 回答 1

2

恐怕你在这里不走运。Autofac.SignalR 是针对 Autofac3+ 构建的,但 Autofac.Mvc3 仅支持 Autofac2.6。

根据Travis Illig的说法,未来似乎也不会增加任何支持

Autofac 有一个保持最新的一般政策,因此随着新 MVC 版本的发布,旧版本将不再获得直接支持。没有支持 MVC3 的 Autofac 3.0 版本,也没有向后移植功能的计划。

因此,您要么升级到 MVC4,要么尝试构建适合您需求的 Autofac.MVC3 的自定义版本。

免责声明:HACK 警报使用它需要您自担风险:

因此,如果你不怕弄脏你的手,你可以在InstancePerHttpRequestAutofac3+的“移植”一点反射的帮助下弄乱 Autofac 的内部结构

只需将此类添加到您的项目中,并确保您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字段。

于 2013-05-30T06:55:18.940 回答