2013-05-30 7 views
1

У меня есть действующее веб-приложение, написанное на MVC3, с использованием Autofac и Autofac.Mvc3. Теперь мне нужно использовать SignalR, поэтому я потянул Autofac.SignalR через Nuget, который обновил Autofac.dll до 3.0.0.Проблема с интеграцией Autofac + MVC3 + SignalR

Что я сейчас вижу, это то, что когда я пытаюсь зарегистрировать тип, я получаю исключение MissingMethodException, когда я вызываю InstancePerHttpRequest как время жизни для типа.

В качестве упражнения я попытался сделать то, что делает регистрация автозапуска моего текущего приложения в новом приложении MVC4, с Autofac.Mvc4 и Autofac.SignalR, который, похоже, работает нормально.

Любая помощь будет оценена

Пример строки, которые вызывают ошибку

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).

StackTrace

на 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

+1

Боюсь, вам здесь не повезло. Вы не можете использовать SignalR с MVC3 и Autofac, потому что нет поддержки Autofac3 в MVC3. См. Также: http://stackoverflow.com/a/16719213/872395 Итак, вам нужно перейти на MVC4 или вам нужно создать собственную версию Autofac.MVC3, которая зависит от Autofac 3.0+. – nemesv

+0

Я пришел к такому же выводу. Не могли бы вы опубликовать это в качестве ответа? – damienc88

+0

Вместо этого вы можете использовать InstancePerLifetimeScope. – jgauffin

ответ

2

Боюсь, что вам здесь не повезло. Autofac.SignalR был создан против Autofac3 +, но Autofac.Mvc3 поддерживает только Autofac2.6.

И, кажется, не будет какой-либо поддержки добавлены в будущем либо в соответствии с Travis Illig

Autofac имеет общую политику пребывания тока, так и новые релизы MVC выгоняют, старые выпуски перестанут получать прямая поддержка. Нет версии Autofac 3.0 с поддержкой MVC3, и нет плана функциональности back-port.

Итак, вы либо обновляетесь до 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

Смежные вопросы