継承の深さが 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
}
}
オブジェクトは次のように Unity コンテナーに登録されます。
container.RegisterType<ICustomSerialDevice, CustomSerialDevice>(
new ContainerControlledLifetimeManager(), new InjectionMethod(postConstructMethodName));
container.Configure<Interception>()
.SetInterceptorFor<ICustomSerialDevice>(new TransparentProxyInterceptor());
残念ながら、私のインターセプターは常にExecuteMyCommand()
メソッドに対してのみ呼び出されます。Unityコンテナを介して私が目指しているそのような傍受を行うことは可能ですか? Spring.NET AOP ライブラリを介してそれを達成しようとゆっくり考えています。