gpt4 book ai didi

c# - 在 PostSharp 的 OnMethodBoundaryAspect 中的 OnEntry 中获取 Controller 的基类成员

转载 作者:行者123 更新时间:2023-11-30 16:08:30 24 4
gpt4 key购买 nike

我想访问我们日志方面类中的基类成员。我有一个基本 Controller ,该 Controller 由测试 Controller 继承,在测试 Controller 中我实现了 AOP Aspect。

在 BaseContoller 中我有一个成员 _userSession。我在调用 BaseContoller 的构造函数时初始化 _userSession。在调用 TestController 之后,首先调用 AOP Aspect。我想在 AOP 的 OnEntry 方法上访问 _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);
}

基础 Controller

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

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

测试 Controller

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

最佳答案

作为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 的类的实例方法。如果您能够在该无参数构造函数中的某处创建/检索表单 session 数据,您也可以在方面进行。

关于c# - 在 PostSharp 的 OnMethodBoundaryAspect 中的 OnEntry 中获取 Controller 的基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29115056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com