Kodama

AspectWeaver クラス

[This is preliminary documentation and subject to change.]

AspectのWeave処理をするクラスです

この型のすべてのメンバの一覧については、 AspectWeaver メンバを参照してください。

System.Object
   Kodama.Aop.Weaver.AspectWeaver

public class AspectWeaver

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、 マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

このクラスはグローバルにインスタンスの生成時に処理を行うために Singletonになっています。

このクラスでWeaveするAspectを登録すると、クラス生成時にAspectが Weaveされます。また、既に生成された既存のインスタンスにAspectを Weaveすることも可能です。

透過的プロクシとメッセージシンクを利用しているため、Weave対象と なるオブジェクトはContextBoundObjectを継承している必要があります。

注意点は透過的プロクシとスタックビルダーシンクのオーバーヘッドが メソッド呼び出しなどにがかかることです。パフォーマンスが要求される場合は アスペクトを利用しない(ContextBoundObjectを継承せずAspectAttribute属性 も指定しない)ことを推奨します。

もうひとつの注意点は透過的プロクシはコンストラクタを直接インターセプト することができません。なので、コンストラクタをインターセプトしたい場合は、 コンストラクタから初期化用のメソッドを呼び出すようにして、その初期化用の メソッドをインターセプトして下さい。

使用例

[C#]

// IMethodInterceptorはメソッドの呼び出しをインターセプトします。
// 派生クラスでIMethodInterceptor#Invokeをオーバーライドして
// インターセプトの処理を書いてください。また、IMethodInterceptor#Invoke内
// では必ず1回、MethodInvocation#Proceedを呼んでください。
// MethodInvocation#Proceedが呼ばれると、インターセプトされたメソッドの
// 本来の処理が実行されます。
public class TestInterceptor : IMethodInterceptor
{
    public object Invoke(MethodInvocation invocation, out object[] outArguments)
    {
        Console.WriteLine("Pre");
        object ret = invocation.Proceed(out outArguments);
        Console.WriteLine("Post");
        return ret;
    }
}

// AttributePointcutの指定で利用する属性を定義します
[AttributeUsage(AttributeTargets.Method)]
public class TestInterceptAttribute : Attribute
{
}

// アスペクトをWeaveするクラスにはAspectTarget属性をつけます。
// また、ContextBoundObjectを継承します。
[AspectTarget]
public class TestAspectWeavedClass : ContextBoundObject
{
    // このメソッドがInterceptされるメソッドです。
    // AttributePointcutを利用する場合、インターセプトされるメソッドには
    // 適当に定義した属性をつけて、AttributePointcutの作成時にその属性を指定します。
    // SignaturePointcutを利用する場合は、メソッド名を正規表現で指定できる
    // ので属性の指定はいりません。
    [TestIntercept]
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}

// このメソッドを実行すると、コンソールに、
// "Pre","Hello","Post"の順で3行、表示されます
public void MethodAttrInterceptTest()
{
    // Aspectの生成
    // InterceptorとPointcutを設定します
    IAspect aspect = new AspectImpl(
        new TestInterceptor(),
        new MethodAttributePointcut(typeof(TestInterceptAttribute));

    // Aspectの登録
    AspectWeaver.Instance().Register(aspect);

    // インスタンスの生成は普通のnew演算子でOKです
    TestAspectWeavedClass wc = new TestAspectWeavedClass();

    // このメソッドがTestInterceptorでインターセプトされます
    wc.Hello();
}

必要条件

名前空間: Kodama.Aop.Weaver

アセンブリ: Kodama.Aop (Kodama.Aop.dll 内)

参照

AspectWeaver クラス | AspectWeaver メンバ | Kodama.Aop.Weaver 名前空間