1

我有以下情况:

public interface IFoo 
{
    void Foo1();

    void Foo2(); 
}

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

    public abstract void Foo2();
}

我想为 IFoo 注册一个服务,由 Foo 实现,但有一个拦截器来处理对未实现抽象成员的调用。所以,我可以这样做:

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>()

但后来我的拦截器最终在拦截时看到 Foo,而不是 IFoo 作为 TargetType ......这不是我想要的。

关于如何做到这一点的任何建议?

谢谢。

4

1 回答 1

1

我想如果你指定:

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

这会奏效。

您最初遇到此问题的原因是因为 Windsor 为服务(它是接口)而不是类(不是服务)创建了一个代理,并且它试图正常实例化类,如果类是显然不可能的抽象的。

这就是为什么如果您也将类指定为服务,则该类也将被代理,并且整个事情都会起作用。

关于你的最后一句话,你不能吃你的蛋糕也有它。如果要代理该类,则该类是代理的目标。

于 2011-05-23T13:21:43.667 回答