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 на эту тему в пост Алекса, который также является очень полезным.
Я не уверен, что вторая часть вашего вопроса очень ясна. Можете ли вы предоставить некоторые фрагменты кода или дополнительные разъяснения? –
Привет Трэвис, Спасибо, что посмотрел на это и извинился, второй вопрос был немного расплывчатым.Я нашел больше информации в другом месте и поэтому удалил свой второй вопрос, поскольку он был слишком сложным, чтобы перечислять его в нескольких строках. Я оставил исходную информацию, поскольку она может быть полезной для других. Благодарю. –