我不确定这是否可以做到,因为从逻辑上讲这对我来说没有意义。我一直在测试 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
变量中,但我认为它非常“丑陋”。