Замок Виндзор Прокси Абстрактный Класс с Интерфейсом - PullRequest
1 голос
/ 23 мая 2011

У меня следующий сценарий:

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 во время перехвата ... что не то, что я хочу.

Есть предложения о том, как этого добиться?

Спасибо.

1 Ответ

1 голос
/ 23 мая 2011

Я думаю, что если вы укажете:

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

, это сработает.

Причина, по которой вы изначально столкнулись с проблемой, заключалась в том, что Windsor создал прокси для служб (который былинтерфейс), а не класс (который не был службой), и он пытался создать экземпляр класса в обычном режиме, что, очевидно, невозможно, если класс является абстрактным.

Вот почему, если вы также указываете класс как службу, класс будеттакже прокси, и все это сработает.

Что касается вашего последнего замечания, вы не можете съесть свой пирог и иметь его тоже.Если вы хотите передать прокси классу, то этот класс является целью прокси.

...