【发布时间】:2014-12-21 12:18:04
【问题描述】:
我拥有继承深度为 3 的对象结构。对象正在实现单个特定接口。接口的继承深度为 4。我的最终对象是通过统一 IoC 构建的。我需要拦截该对象中的每个公共方法(意味着无论它在哪个接口中定义),尽管无论我使用什么拦截器类型(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 库来实现它。
【问题讨论】:
-
您能否更新您的问题并显示您的对象图的外观(例如,如果您手动构建此对象图,代码会是什么样子)?您想添加哪些跨领域关注点?
-
对象图相当多,因为它依赖于多个对象,而多个对象也依赖于其他一些对象;类 CustomSerialDevice 只是统一容器范围内的一个单例对象,尽管它对其他对象有多个依赖项,所以手动它可能类似于 new CustomSerialDevice {Dependency1 = new Dependency1 { Dependency2 = new Dependency2()} ....} .这是您在第一个问题中的意思吗?我需要对 CustomSerialDevice 的每个方法(也包括继承的方法)做一些一般的异常处理
-
没错,但我宁愿看到你用类型的实际名称来展示它。问题是我经常看到开发人员由于他们的设计缺陷而依赖于拦截(例如与使用装饰器相比)来应用横切关注点。如果我们可以查看设计以及您如何尝试应用这些横切关注点,我们或许能够就设计提供反馈。
标签: c# unity-container aop unity-interception