将信息从Postsharp方面传递给实际方法

时间:2013-11-01 21:04:27

标签: c# aop postsharp

我不确定是否可以这样做,因为逻辑上对我来说没有意义。我一直在测试Postsharp方面和AOP,我可以非常看到它们可以为代码库带来的好处。

我使用RavenDB(文档数据库),有时我有'任务',基本上他们必须创建会话对象,做一些逻辑,然后调用session.SaveChanges()。这对TaskAspect非常有益,.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()

您可以看到的问题是对ThreadStatic的调用不了解会话。任何想法如何传递这些信息?首先是有意义的,还是这个逻辑有缺陷,我不应该为此使用方面?

我想到的一个想法是将会话存储在{{1}}变量中,但我认为它非常“难看”。

1 个答案:

答案 0 :(得分:1)

正如您所提到的,您可以使用[ThreadStatic]字段(类型可能需要Stack<Session>)。

您还可以在方法中定义一个参数(可能设置一个默认的空值),并在调用Proceed之前让方面设置参数。要设置参数,请使用args.Arguments