gpt4 book ai didi

c# - CaSTLe Windsor 可以帮我拆分一个大接口(interface)的实现吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:37 29 4
gpt4 key购买 nike

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

我需要 DI 容器协作,因为我不想解决所有依赖大接口(interface)可能只是代理对较小实现的调用。

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

最佳答案

我可以通过 interceptors 看到它的实现,为每个小接口(interface)使用一个拦截器。使用此方法,为 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 注册拦截器(如果您需要提供依赖项)。

关于c# - CaSTLe Windsor 可以帮我拆分一个大接口(interface)的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com