2015-11-24 3 views
1

«Переадресованный тип» в Castle Windsor означает, что одна (большая) реализация служит для нескольких (малых) интерфейсов. Моя проблема противоположна: как обрабатывать один (большой) интерфейс, который мне нужно поддерживать несколькими (малыми) реализациями?Can Castle Windsor поможет мне разделить реализацию большого интерфейса?

Мне нужно сотрудничество с контейнером DI, потому что я не хочу разрешать все зависимости, которые большой интерфейс может иметь только для прокси-вызовов для небольших реализаций.

В идеале я бы сказал, что «перенаправляет каждый IBig.SomeMethod (...) на некоторый соответствующий IOneOfSmallOnes.SomeMethod (...) без создания какой-либо полной реализации IBig - только IOneOfSmallOnes one». Есть ли способ, которым я могу это сделать, не копаясь слишком глубоко в коде замка Виндзор?

ответ

3

Я мог видеть реализацию этого через interceptors, используя один перехватчик для каждого из небольших интерфейсов. Используя этот метод, создается прокси-объект для IBig, и все вызовы методов передаются первому перехватчику. Затем этот перехватчик решает, хочет ли он обработать вызов метода или просто передать его следующему перехватчику в цепочке.

Один из этих перехватчиков будет выглядеть следующим образом:

public class FirstSmallInterceptor : Castle.DynamicProxy.IInterceptor 
{ 
    public FirstSmallInterceptor(IFirstSmallOne firstSmallOne) { ... } 

    public void Intercept(IInvocation invocation) 
    { 
     if (invocation.Method.Name == nameof((IFirstSmallOne.FirstSomeMethod)) 
      invocation.ReturnValue = firstSmallOne.FirstSomeMethod(/* cast invocation.Arguments items */); 
     else 
      invocation.Proceed(); 
    } 
} 

И ваша регистрация будет просто:

container.Register(Component.For<IBig>() 
          .Interceptors(
           InterceptorReference.ForType<FirstSmallInterceptor>(), 
           InterceptorReference.ForType<SecondSmallInterceptor>(), 
           InterceptorReference.ForType<ThirdSmallInterceptor>() 
          )); 

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

+0

Ницца, это может работать. Я бы просто изменил вызов FirstSomeMethod на некоторый аргумент отражения, передавая магию, поэтому мне не нужно менять перехватчик каждый раз, когда я меняю подпись метода. –