2010-03-01 8 views
4

La description J'avais un type hérité HttpRequestScoped et un service Web hérité consommant ce service. Pour résoudre les services dans les préoccupations héritées, j'ai un résolveur global. Tout cela fonctionnait bien dans 1.4, et maintenant que j'utilise 2.1.12, je rencontre DependencyResolutionException.Résolution des services HttpRequestScoped dans ASMX avec Autofac 2.1.12

Le code En 2.1.12, mes 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 est un singleton, et il est mis à AutofacResolver qui ressemble à ceci:

public class AutofacResolver : IResolver 
{ 
    private readonly IContainer _container; 

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

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

Le service Web ressemble à ceci:

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

L'exception L'exception suivante lorsque Setup.Resolver.Get<SomeLegacyType>() est appelé:

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) 

Question Side Y at-il une meilleure façon d'avoir des propriétés injectées dans ASMX, de la même manière mes pages ASPX sont injectées (plutôt que d'utiliser Setup.Resolver) ? J'utilise le AttributedInjectionModule en raison de problèmes hérités. Il ne semble pas que le module fonctionne sur ASMX.

Répondre

5

Si vous configurez votre 'resolver' pour utiliser RequestLifetime plutôt que ApplicationContainer, tout devrait fonctionner comme prévu. Cela signifie que votre paramètre IContainer devra être remplacé par ILifetimeScope.

Je ne suis pas sûr d'un meilleur moyen d'injecter des dépendances ASMX, il peut y en avoir un mais je ne pense pas qu'Autofac le supporte.

Questions connexes