gpt4 book ai didi

c# - 拦截具有深继承树的对象

转载 作者:行者123 更新时间:2023-11-30 12:26:46 24 4
gpt4 key购买 nike

我有继承深度为 3 的对象结构。对象正在实现单个特定接口(interface)。接口(interface)的继承深度为 4。我的最终对象是通过统一 IoC 构造的。我需要拦截此对象中的每个公共(public)方法(意味着无论它是在哪个接口(interface)中定义的),尽管无论我使用何种拦截器类型(InterfaceInterceptor/TransparentProxyInterceptor/VirtualMethodInterceptor)它总是只拦截在继承树的最终类中定义的方法。请看下面的对象结构图:

public interface IDevice {
void Connect();
}

public interface ISerialDevice {
void WriteCommand();
}

public interface IProtocolSerialDevice {
void ExecuteProtocolCommand();
}

[MyHandler]
public interface ICustomSerialDevice {
void ExecuteMyCommand();
}

public abstract class AbstractSerialDevice {
public virtual void WriteCommand() {
//omitted
}
}

public abstract class AbstractProtocolSerialDevice : AbstractSerialDevice {
public virtual void ExecuteProtocolCommand() {
//omitted
}
}


public class CustomSerialDevice : AbstractProtocolSerialDevice, ICustomSerialDevice {
public virtual void ExecuteMyCommand() {
//omitted
}
}

public class MyHandlerAttribute : HandlerAttribute {
public override ICallHandler CreateHandler(IUnityContainer container) {
//omitted
}
}

对象注册到统一容器如下:

container.RegisterType<ICustomSerialDevice, CustomSerialDevice>(
new ContainerControlledLifetimeManager(), new InjectionMethod(postConstructMethodName));

container.Configure<Interception>()
.SetInterceptorFor<ICustomSerialDevice>(new TransparentProxyInterceptor());

不幸的是,我的拦截器总是只针对 ExecuteMyCommand() 方法被调用。是否有可能通过统一容器进行我正在努力实现的拦截?我正在慢慢考虑尝试通过 Spring.NET AOP 库来实现它。

最佳答案

首先,我建议您尽可能使用 InterfaceInterceptor。它将为您提供最佳的灵 active 和性能。当您不能使用 InterfaceInterceptor 时,回退到使用 VirtualMethodInterceptor。作为最后的手段,使用 TransparentProxyInterceptor。参见 here .

对于接口(interface),处理程序属性仅适用于在该接口(interface)上定义的方法(不是继承的)。所以你可以通过用 [MyHandler] 属性装饰所有 4 个接口(interface)来实现你想要的。

对于具体类,处理程序属性适用于所有继承类型。因此,您可以通过使用 [MyHandler] 属性装饰顶部的 AbstractSerialDevice 来实现您的目标。您还可以在接口(interface)或具体类级别上装饰各个方法。

此外,在我看来,修饰具体方法比修饰类型更容易被发现。尽管它有点冗长。


选项 1

// No MyHandler on any of the concrete classes

[MyHandler]
public interface IDevice
{ /* omitted */ }

[MyHandler]
public interface ISerialDevice : IDevice
{ /* omitted */ }

[MyHandler]
public interface IProtocolSerialDevice : ISerialDevice
{ /* omitted */ }

[MyHandler]
public interface ICustomSerialDevice : IProtocolSerialDevice
{ /* omitted */ }

选项 2

// No MyHandler on any of the interfaces nor derived classes

[MyHandler]
public abstract class AbstractSerialDevice : ISerialDevice
{ /* omitted */ }

选项 3

// No MyHandler on any of the interfaces nor abstract classes

public class CustomSerialDevice : AbstractProtocolSerialDevice, ICustomSerialDevice
{
[MyHandler]
public override void Connect()
{ base.Connect(); }

[MyHandler]
public override void WriteCommand()
{ base.WriteCommand(); }

[MyHandler]
public override void ExecuteProtocolCommand()
{ base.ExecuteProtocolCommand(); }

[MyHandler]
public void ExecuteMyCommand()
{ /*omitted*/ }
}

这些选项是否适合您?

关于c# - 拦截具有深继承树的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582868/

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