gpt4 book ai didi

c# - 统一: Register two interfaces as one singleton with interception

转载 作者:太空狗 更新时间:2023-10-29 21:19:40 26 4
gpt4 key购买 nike

我有一个实现了两个接口(interface)的类,我想对类的方法应用拦截。

我正在遵循 Unity Register two interfaces as one singleton 中的建议,但我对结果感到惊讶。简而言之,我的 CallHandler 似乎被调用了两次。我有的最短的例子是这样的:

public interface I1
{
void Method1();
}

public interface I2
{
void Method2();
}

public class C : I1, I2
{
[Log]
public void Method1() {}

public void Method2() {}
}

public class LogAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogCallHandler();
}
}

public class LogCallHandler : ICallHandler
{
public IMethodReturn Invoke(
IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("Entering " + input.MethodBase.Name);
var methodReturn = getNext().Invoke(input, getNext);
Console.WriteLine("Leaving " + input.MethodBase.Name);
return methodReturn;
}

public int Order { get; set; }
}

void Test()
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<C>(new ContainerControlledLifetimeManager());

container.RegisterType<I1, C>(
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<PolicyInjectionBehavior>());

container.RegisterType<I2, C>(
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<PolicyInjectionBehavior>());

container.Resolve<I1>().Method1();
}

这给出了这个输出:

Entering Method1
Entering Method1
Leaving Method1
Leaving Method1

删除“container.RegisterType I2, C”行使日志只出现一次。添加第三个接口(interface)I3,与I2类似,导致日志出现三次。

我原以为日志只会被调用一次。我可能可以通过让 LogCallHandler 检测它是否被另一个 LogCallHandler 调用来实现这一点,但这似乎不够优雅。

最初我想将拦截行为应用于 C,而不是分别应用于 I1 和 I2,但这需要 C 继承自 MarshalByRefObject,这是一个我还不愿意强加的约束。

还有其他方法吗?

最佳答案

问题是您将透明代理应用于每个接口(interface)。相反,如果您将它应用于具体类,您只会得到一个代理。此外,除非您希望共享实例,否则无需将其设为单例。

我在测试控制台项目中运行了此配置并获得了预期的结果。感谢您包含一个可以隔离您的问题的工作片段!

var container = new UnityContainer()
.AddNewExtension<Interception>()
.RegisterType<I1, C>()
.RegisterType<I2, C>()
.RegisterType<C>(
new ContainerControlledLifetimeManager(),
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<PolicyInjectionBehavior>()
);

关于c# - 统一: Register two interfaces as one singleton with interception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367594/

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