我不确定是否可以这样做,因为逻辑上对我来说没有意义。我一直在测试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}}变量中,但我认为它非常“难看”。
答案 0 :(得分:1)
正如您所提到的,您可以使用[ThreadStatic]
字段(类型可能需要Stack<Session>
)。
您还可以在方法中定义一个参数(可能设置一个默认的空值),并在调用Proceed
之前让方面设置参数。要设置参数,请使用args.Arguments
。