【问题标题】:Can Castle Windsor help me to split implementation of a big interface?Castle Windsor 可以帮我拆分大接口的实现吗?
【发布时间】:2015-11-24 14:05:11
【问题描述】:

Castle Windsor 中的“转发类型”意味着一个(大)实现服务于多个(小)接口。我的问题是相反的:如何处理我必须由多个(小)实现维护的一个(大)接口?

我需要 DI 容器合作,因为我不想解决所有依赖关系,大接口可能只是将调用代理到较小的实现。

理想情况下,我会说“将每个 IBig.SomeMethod(...) 重定向到一些匹配的 IOneOfSmallOnes.SomeMethod(...) 而不实例化任何完整的 IBig 实现 - 只是 IOneOfSmallOnes 一个”。有没有办法在不深入挖掘温莎城堡代码的情况下做到这一点?

【问题讨论】:

    标签: c# interface refactoring castle-windsor


    【解决方案1】:

    我可以看到通过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 注册拦截器(以防您需要提供依赖项)。

    【讨论】:

    • 很好,这可能行得通。我只需将对 FirstSomeMethod 的调用更改为一些反射参数传递魔术,这样我就不必每次更改方法的签名时都更改拦截器。
    【解决方案2】:

    受 Patrick 方法的启发,我实现了 InterfaceSplittingFacility

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多