1

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

4

1 回答 1

1

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

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

于 2013-11-02T10:21:32.763 回答