[英]Can Castle Windsor help me to split implementation of a big interface?
Castle Windsor中的“转发类型”意味着一个(大)实现服务于多个(小)接口。 我的问题是相反的:如何处理我必须由多个(小)实现维护的一个(大)接口?
我需要DI容器合作,因为我不想解决所有依赖关系大型接口只能代理对较小实现的调用。
理想情况下,我会说“将每个IBig.SomeMethod(...)重定向到一些匹配的IOneOfSmallOnes.SomeMethod(...)而不实例化任何完整的IBig实现 - 只需要IOneOfSmallOnes一个”。 有没有办法,我可以做到这一点,而不深入了解温莎城堡代码?
我可以看到通过拦截器实现这一点,为每个小接口使用一个拦截器。 使用此方法,为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注册拦截器(如果您需要提供依赖项)。
受Patrick的方法启发,我实现了InterfaceSplittingFacility 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.