1

次のシナリオがあります。

public interface IFoo 
{
    void Foo1();

    void Foo2(); 
}

public abstract class Foo : IFoo
{
    public void Foo1() { }

    public abstract void Foo2();
}

Fooによって実装されたIFooのサービスを登録したいのですが、実装されていない抽象メンバーへの呼び出しを処理するインターセプターを使用します。だから、私はすることができます:

container.Register(Component.For<IFoo>()
.ImplementedBy<Foo>().Interceptors<MyInterceptor>());

しかし、コンポーネントをアクティブ化しようとすると、次の例外が発生します。

"Instances of abstract classes cannot be created."

   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext context, Object[] arguments, Type[] signature)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext context)
   at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)
   at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context)
   at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext context)
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
   at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveServiceDependency(CreationContext context, ComponentModel model, DependencyModel dependency)

以下が正常に機能することに気づきました。

Component.For<Foo>().Forward<IFoo>().Interceptors<MyInterceptor>()

しかし、その後、インターセプターは、インターセプト時にTargetTypeとしてIFooではなくFooを見ることになります...これは、私が望んでいることではありません。

これを達成する方法について何か提案はありますか?

ありがとう。

4

1 に答える 1

1

あなたが指定した場合、私は思います:

Component.For<IFoo, Foo>().Interceptors<MyInterceptor>()

これは機能します。

最初に問題が発生した理由は、Windsorがクラス(サービスではない)ではなくサービス(インターフェイスである)のプロキシを作成し、クラスを正常にインスタンス化しようとしたためです。これは、クラスが概要。

そのため、クラスをサービスとして指定すると、クラスもプロキシされ、このすべてが機能します。

最後の発言ですが、ケーキを食べて食べることはできません。クラスをプロキシする場合は、クラスがプロキシのターゲットになります。

于 2011-05-23T13:21:43.667 に答える