我已经使用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()中
答案 0 :(得分:2)
我担心你在这里运气不好。 Autofac.SignalR是针对Autofac3 +构建的,但Autofac.Mvc3仅支持Autofac2.6。
,似乎未来不会有任何支持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
字段。