/ / Resolución de servicios HttpRequestScoped en ASMX con Autofac 2.1.12 - asmx, autofac

Resolución de servicios HttpRequestScoped en ASMX con Autofac 2.1.12 - asmx, autofac

La descripción Tenía un tipo de legado que es HttpRequestScoped y un servicio web heredado que consume ese servicio. Para resolver servicios en problemas heredados, tengo un solucionador global. Todo esto funcionaba bien en 1.4, y ahora que estoy usando 2.1.12 estoy experimentando DependencyResolutionException.

El código En 2.1.12, mi Global.asax.cs:

builder.Register(c => new SomeLegacyType(HttpContext.Current)) // note: it relies on HttpContext.Current
.As<SomeLegacyType>()
.HttpRequestScoped();

_containerProvider = new ContainerProvider(builder.Build()); // this is my app"s IContainerProvider
Setup.Resolver = new AutofacResolver(_containerProvider.ApplicationContainer);

Setup.Resolver es un singleton, y se está configurando en AutofacResolver que se parece a esto:

public class AutofacResolver : IResolver
{
private readonly IContainer _container;

public AutofacResolver(IContainer container)
{
_container = container;
}

public TService Get<TService>()
{
return _container.Resolve<TService>();
}
}

El servicio web se ve así:

[WebService]
public LegacyWebService : WebService
{
[WebMethod(EnableSession=true)]
public String SomeMethod()
{
var legacyType = Setup.Resolver.Get<SomeLegacyType>();
}
}

La excepción La siguiente excepción cuando Setup.Resolver.Get<SomeLegacyType>() se llama:

Autofac.Core.DependencyResolutionException: No scope matching the expression "value(Autofac.Builder.RegistrationBuilder`3+<>c__DisplayClass0[SomeAssembly.SomeLegacyType,Autofac.Builder.SimpleActivatorData,Autofac.Builder.SingleRegistrationStyle]).lifetimeScopeTag.Equals(scope.Tag)" is visible from the scope in which the instance was requested.
at Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope)
at Autofac.Core.Resolving.ComponentActivation..ctor(IComponentRegistration registration, IResolveOperation context, ISharingLifetimeScope mostNestedVisibleScope)
at Autofac.Core.Resolving.ResolveOperation.Resolve(ISharingLifetimeScope activationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Lifetime.LifetimeScope.Resolve(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Container.Resolve(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.TryResolve(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context)

Pregunta lateral ¿Hay una mejor manera de inyectar propiedades en ASMX, de la misma manera que mis páginas ASPX se inyectan (en lugar de usarlas)? Setup.Resolver)? Yo uso el AttributedInjectionModule debido a las preocupaciones del legado. No parece que el módulo funcione en ASMX.

Respuestas

5 para la respuesta № 1

Si configura su "resolución" para usar RequestLifetime en lugar de ApplicationContainer, todo debería funcionar como se espera.

Esto significa que su parámetro IContainer tendrá que cambiar a ILifetimeScope.

No estoy seguro de una mejor manera de inyectar las dependencias ASMX, puede haber una, pero no creo que Autofac lo admita.