繁体   English   中英

Can Castle Windsor能帮助我拆分大型界面的实现吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM