4

説明レガシー タイプHttpRequestScopedと、そのサービスを使用するレガシー Web サービスがありました。レガシーの問題でサービスを解決するために、グローバル リゾルバーがあります。これはすべて 1.4 でうまく機能していましたが、現在 2.1.12 を使用しているため、DependencyResolutionException.

コード2.1.12 では、私の 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 はシングルトンで、次のような AutofacResolver に設定されています。

public class AutofacResolver : IResolver
{
    private readonly IContainer _container;

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

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

Web サービスは次のようになります。

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

例外Setup.Resolver.Get<SomeLegacyType>()が呼び出されると、次の例外が発生します。

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)

副次的な質問ASPX ページが挿入されるのと同じ方法で (を使用するのではなく)、ASMX にプロパティを挿入するより良い方法はありますSetup.Resolver? AttributedInjectionModuleレガシーの問題があるため、 を使用します。モジュールが ASMX で動作するようには見えません。

4

1 に答える 1

5

ApplicationContainer ではなく RequestLifetime を使用するように「リゾルバー」を構成すると、すべてが期待どおりに機能するはずです。

これは、IContainer パラメーターを ILifetimeScope に変更する必要があることを意味します。

ASMX の依存関係を挿入するためのより良い方法についてはわかりません。あるかもしれませんが、Autofac ではサポートされていないと思います。

于 2010-03-02T08:06:30.470 に答える