Подтвердить что ты не робот

Как я могу использовать Autofac в EndRequest?

Я использую Autofac с .Net MVC 3. Кажется, что Autofac располагает областью lifetime в Application_EndRequest, что имеет смысл. Но это вызывает эту ошибку, когда я пытаюсь найти службу в своем собственном коде, который выполняется во время EndRequest:

 MESSAGE: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.
STACKTRACE: System.ObjectDisposedException
  at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
  at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
  at System.Web.Mvc.DependencyResolverExtensions.GetService[TService](IDependencyResolver resolver)

Для справки, здесь код, который я использую, чтобы попытаться разрешить службы:

    public T GetInstance<T>()
    {
        return DependencyResolver.Current.GetService<T>();
    }

Можно ли каким-либо образом иметь код, который выполняется из EndRequest, использовать Autofac для разрешения службы?

Изменить: я думал о том, чтобы делать это с отдельной областью только во время EndRequest, как предлагает Джим ниже. Однако это означает, что любые службы, зарегистрированные как InstancePerHttpRequest, получат новый экземпляр во время EndRequest, который кажется не идеальным.

4b9b3361

Ответ 1

Вероятно, вам придется создать свою собственную сферу жизни. Предполагая, что у вас есть что-то в своем global.asax.cs:

public class MvcApplication : HttpApplication
{
    internal static readonly IContainer ApplicationContainer = InitAutofac();
}

Тогда вы могли бы сделать что-то подобное в своем EndRequest:

using (var scope = MvcApplication.ApplicationContainer.BeginLifetimeScope())
{
    var service = scope.Resolve<Stuff>();
    service.DoStuff();
}