Postsharp新手 - 为什么args.Instance为空?

时间:2011-07-02 21:02:12

标签: aop postsharp

PostSharp的新功能---我现在正在尝试NuGet版本,并且我试图在AuthoriseAttribute OnEntry方法中理解agrs.Instance值为null的wny。我正在尝试实现取决于对象值的作者身份,例如已归档的客户无法提高信用额度。我正在其他特定于规则的类中实现规则。

public class Program
{
    static void Main(string[] args)
    {
        var c = new Customer();
        c.RaiseCreditLimit(100000);
        c.Error(00); 
    }
}

public class Customer
{
    [AuthorizeActivity]
    public void RaiseCreditLimit(int newValue)
    {
    }

    [AuthorizeActivity]
    public void Error(int newValue)
    {

    }
}

[Serializable]
public class AuthorizeActivityAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        //
        //Why is args.Instance null???????????
        //
        if (args.Method.Name == "RaiseCreditLimit")
        {
            Debug.WriteLine(args.Method.Name + " started");
        }
        else
        {
            throw new Exception("Crap");
        }
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        Debug.WriteLine(args.Method.Name + " finished");
    }
}

1 个答案:

答案 0 :(得分:6)

答案是因为你没有在你的方面使用它。这是一个优化。如果您在方面使用它,那么它将被设置。将您的方面更改为使用实例,它将在那里。

public override void OnEntry(MethodExecutionArgs args)
        {
            //
            //Why is args.Instance null???????????
            //
            if (args.Method.Name == "RaiseCreditLimit")
            {
                Debug.WriteLine(args.Instance.GetType().Name);
                Debug.WriteLine(args.Method.Name + " started");
            }
            else
            {
                throw new Exception("Crap");
            }
        }

有关详细信息,请查看此文章,了解PostSharp还有哪些优化代码http://programmersunlimited.wordpress.com/2011/03/23/postsharp-weaving-community-vs-professional-reasons-to-get-a-professional-license/