2012-06-04 1 views
3

Я создаю четырехслойную систему с MVC3 в качестве основного интерфейса, но содержащую длительные задачи, которые выполняются асинхронно с помощью уровня сервиса и сообщают о ходе выполнения, который MVV будет показывать с использованием Ajax , Я использую Autofac для инъекций зависимостей (DI) в основном потому, что интерфейс и документация хороши и потому, что они быстрые (см. Это отличное исследование на DI speed Филиппа Матееску).Autofac - mixed InstancePerHttpRequest и асинхронный объем

Мой вопрос заключается в том, как настроить Autofac для обработки двух областей вложенных элементов, то есть зависимости MVC3 должны быть PerHttpRequest, но зависимости async-задач должны быть InstancePerLifetimeScope.

Очевидно, что для устранения долговременных задач на уровне обслуживания необходимо использовать отдельный DI. Каков наилучший способ сделать это?

+0

Я не уверен, что вторая часть вашего вопроса очень ясна. Можете ли вы предоставить некоторые фрагменты кода или дополнительные разъяснения? –

+0

Привет Трэвис, Спасибо, что посмотрел на это и извинился, второй вопрос был немного расплывчатым.Я нашел больше информации в другом месте и поэтому удалил свой второй вопрос, поскольку он был слишком сложным, чтобы перечислять его в нескольких строках. Я оставил исходную информацию, поскольку она может быть полезной для других. Благодарю. –

ответ

7

Update - июнь 2014

Я обновил этот ответ, как лучшая практика по использованию AutoFac переместилась дальше, плюс изменение в MVC. Это изменение заключается в том, что лучшая практика в AutoFac теперь заключается в определении любых случаев, которые должны длиться в течение всего времени жизни доступа, в случае MVC HttpRequest, с использованием суффикса .InstancePerLifetimeScope(). Ниже для примера:

builder.RegisterType<MyDbContext>().As<IMyDbContext>().InstancePerLifetimeScope(); 

Сделав, что вам больше не нужно указать имя нового пожизненного объема, который вы создаете внутри задачи (см оригинального ответа, который был обновлен, ниже).

Вот несколько других заметок о многозадачности в MVC, что вы могли бы оказаться полезными:

  • Если вы используете новый асинхр/ждать, то делать не нужен новый пожизненный объем. Aysnc/await поддерживает текущий контекст и просто освобождает поток, чтобы повысить производительность сети под нагрузкой.
  • Если вы действительно хотите что-то запустить в фоновом режиме, тогда будьте предупреждены - есть некоторые проблемы. Я предлагаю вам прочитать это helpful blog post от эксперта по асинхронному, Стивен Клири.
  • Одна действительно полезная комбинация использует SignalR в сочетании с MVC для отчета о прогрессе и позволяет пользователю отменить. Это хорошо сработало для меня.

Оригинальный пост, но обновляется (примечание: вы должны зарегистрировать экземпляры области действия прижизненные, как показано выше)

Я нашел, как справиться с задачей асинхронной с зависимостями, хотя в группе Google Autofac. Оказывается, вы можете получить доступ к контейнеру уровня MVC, а затем создать новый срок действия решения. Есть несколько способов сделать это, но это ответ answer от Alex Meyer-Gleaves (кто эксперт). Алекс предлагает следующий код ниже для запуска задачи с разной степенью.

public void Run<T>(Action<T> action) 
{ 
    Task.Factory.StartNew(delegate 
    { 
    using (var container = AutofacDependencyResolver.Current 
          .ApplicationContainer.BeginLifetimeScope()) 
    { 
     var service = container.Resolve<T>(); 
     action(service); 
    } 
    }); 
} 

Существует ссылка на более подробную блоге here на эту тему в пост Алекса, который также является очень полезным.

+0

Пожалуйста, добавьте ответ здесь как ответ, а не редактируйте свой вопрос. Это лучший способ для вопроса и ответа на вопрос «Переполнение стека». Благодарю. –

+0

Спасибо за это Джон Смит. У вас не получилось бы иметь ссылку на лучшую практику InstancePerLifetimeScope с MVC + Autofac? Я посмотрел [здесь] (https://code.google.com/p/autofac/wiki/BestPractices), но без радости ... –

+1

Привет @ Джонни Рейли. Его под контролем масштаба и времени жизни -> Область экземпляра в вики. https://code.google.com/p/autofac/wiki/InstanceScope. Надеюсь, это поможет. –

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