在PostSharp中的OnMethodBoundaryAspect中获取OnEntry中的控制器的基类成员

时间:2015-03-18 05:56:34

标签: c# postsharp

我想在Log Aspect Class中访问基类成员。我有一个基本控制器&该控制器由Test controller&在测试控制器中我实现了AOP Aspect。

在BaseContoller中我有一个成员_userSession。我在调用BaseContoller的构造函数时初始化_userSession。并且在调用TestController之后首先调用AOP Aspect。我想在AOP的OnEntry方法上使用Access _userSession。

LogAspect类

[Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method)]
    public class LogAspect:PostSharp.Aspects.OnMethodBoundaryAspect
    {
        public object UserData;

        public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
        {
            LogManager.Info(string.Format("Starting - {0}-{0}",args.Instance, new StackTrace().GetFrame(1).GetMethod().Name));

// want access PCX.Portal.Controllers.BaseController._userSession member here its showing in quick watch like this
//((PCX.Portal.Controllers.BaseController)(args.Instance))._userSession

           LogManager.Info(string.Format("User data - {0}", FrameworkHelper.Helper.JSONHelper.GetJSON(UserData)));


            if(args.Arguments.Count>0)
            {
                foreach (var item in  args.Arguments)
                {
                    LogManager.Info(string.Format("arguments - {0}", FrameworkHelper.Helper.JSONHelper.GetJSON(item)));
                }
            }

            base.OnEntry(args);
        }

基本控制器

public class BaseController : Controller
    {
        public UserSession _userSession { set; get; }
        AuthenticationManager _authenticationManager = new AuthenticationManager();

        public BaseController()
        {
//initializing _userSession here  
                 _userSession.userid=4 ;
_userSession.customerId=5 ;
        }
}

测试控制器

[LogAspect]
    public class TestController : BaseController
    {
        public ActionResult Index()
        {
            return View();            
        }
}

1 个答案:

答案 0 :(得分:3)

正如documentation所述:

MethodExecutionArgs类包含属性Instance

Gets or sets the object instance on which the method is being executed.

只要您的方法不是静态的,您将获得该方法中this的对象。现在您需要将其投放到BaseController,因为您的财产是公开的,您将能够访问它。

if(args.Instance != null){
    var baseController = (BaseController)args.Instance;
    baseController._userSession
}

虽然这是你要求的,但我觉得需要注意的是,这种方法限制了你的方面只能实现从BaseController继承的类的实例方法。如果您能够在该无参数构造函数中的某个地方创建/检索会话数据,您也可以在方面进行。