1

論理的には意味がないので、これができるかどうかはわかりません。私は Postsharp の側面と AOP 全般をテストしてきましたが、それらがコードベースにもたらす利点を大いに理解しています。

私は RavenDB (ドキュメント データベース) を使用していますが、基本的にセッション オブジェクトを作成し、いくつかのロジックを実行し、その後 session.SaveChanges() を呼び出す必要がある「タスク」がある場合があります。TaskAspectこれは、基本的にセッションの作成と呼び出しを行うa にとって非常に有益です.SaveChanges()

主な問題は、ビジネス ロジックで新しいドキュメントが作成されるときに、 を呼び出す必要がある場合があることsession.Store(newObject)です。問題は、セッションが で作成されているため、実際のメソッドでは使用できないことですMethodInterceptionAspect

以下は、非常に基本的なTaskAspect実装とサンプル ロジックです。

[Serializable]
public class TaskAspect : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        var session = RavenUtil.CreateSession();

        args.Proceed();

        session.SaveChanges();
        session.Dispose();
        base.OnInvoke(args);
    }

}

public class SampleLogic
{
      [TaskAspect]
      public void CreateItem()
      {
            var product = new Product();
            session.Store(product);   //<---- how can I obtain this session, as it is created in the aspect??

      }


}

ご覧のとおり、問題は への呼び出しがargs.Proceed()セッションについて認識していないことです。そのような情報を渡す方法はありますか?それはまず第一に理にかなっていますか、それともこのロジックに欠陥があり、これにアスペクトを使用するべきではありませんか?

頭に浮かんだ考えの 1 つは、セッションをThreadStatic変数に格納することでしたが、それは非常に「醜い」と思います。

4

1 に答える 1

1

あなたが言及したように、[ThreadStatic]フィールドを使用できます(タイプはおそらく である必要がありますStack<Session>)。

メソッドでパラメーターを定義し (おそらくデフォルトの null 値を設定)、 を呼び出す前にアスペクトにパラメーターを設定させることもできますProceed。パラメータを設定するには、 を使用しますargs.Arguments

于 2013-11-02T10:21:32.763 に答える