我希望访问日志方面类中的基类成员。我有一个基本控制器&该控制器由测试控制器&在测试控制器中,我实现了AOP方面。
在BaseContoller中,我有一个成员_userSession。当调用BaseContoller的构造函数时,我正在初始化_userSession。在调用TestController之后,将调用第一个AOP方面。我想要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();
}
}
如文档所示:
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
的类的实例方法。如果您能够在无参数构造函数中的某个位置创建/检索表单会话数据,那么您也可以在方面中执行此操作。