論理的には意味がないので、これができるかどうかはわかりません。私は 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
変数に格納することでしたが、それは非常に「醜い」と思います。