2

autofacを使用してWCFクライアントの登録を管理しようとしています。

解決する必要があるFunc<MachineEndpoint, IFooService>ので、次を使用してサービスを登録しました。

builder.Register((c, p) => FooService(c, p.TypedAs<MachineEndpoint>())).UseWcfSafeRelease()

FooServiceの場所:

private IJobService FooService(IComponentContext c, MachineEndpoint endpoint) {...}

これは正常に機能しますが、特定のセキュリティエラーを処理するためにこれにデコレータを追加したいので、次のことを試しました。

builder.Register((c, p) => FooService(c, p.TypedAs<MachineEndpoint>())).UseWcfSafeRelease().Named<IFooService>("simple foo service");
builder.RegisterDecorator<IFooService>((c, p, inner) => Wrap(inner, p.TypedAs<MachineEndpoint>(), c.Resolve<CertificateLookupCache>()), "simple foo service");

しかし、DependecyResolutionExceptionが発生します:

Autofac.Core.DependencyResolutionException: An exception was thrown while executing a resolve operation. See the InnerException for details. ---> System.InvalidOperationException: Sequence contains no elements
   at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   at MyModule.<Load>b__4(IComponentContext c, IEnumerable`1 p) in MyModule.cs:line 30 (the first line above)
   at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p)
   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Features.LightweightAdapters.LightweightAdapterRegistrationSource.<>c__DisplayClass3.<RegistrationsFor>b__1(IComponentContext c, IEnumerable`1 p)
   at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p)
   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
   --- End of inner exception stack trace ---

Server stack trace:
   at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at lambda_method(Closure , MachineEndpoint )

MachinEndpointパラメーターをWCFクライアントオブジェクトとデコレーターの両方に渡すことができるように、これらの関数を登録するにはどうすればよいですか?

4

1 に答える 1

2

問題は、パラメーターの使用によって引き起こされます。p.TypedAs<MachineEndpoint>()現在、Autofac には、装飾されたオブジェクトRegisterDecoratorの作成時にパラメーターを通過しないという制限があるためです。inner

したがって、で作成しようとするinnerと、空(c, p) => FooService(c, p.TypedAs<MachineEndpoint>())(IEnumerable<Parameter> p)なるため、例外が発生します。

基本的に次の 2 つのことを行うことができます。

p.TypedAs<MachineEndpoint>()もう使用されていない方法でコードを再編成することができます。

または

IFooServiceとにかく、複数の実装を持たない WCF サービスであるため、Decorator を「手動」で登録できます。

builder.Register((c, p) => FooService(c, p.TypedAs<MachineEndpoint>()))
       .UseWcfSafeRelease()
       .Named<IFooService>("simple foo service");
builder.Register<IFooService>((c, p) => 
     Wrap(c.ResolveNamed<IFooService>("simple foo service",
          TypedParameter.From(p.TypedAs<MachineEndpoint>())),
          p.TypedAs<MachineEndpoint>(),
          c.Resolve<CertificateLookupCache>()));
于 2013-03-18T21:39:54.990 に答える