gpt4 book ai didi

c# - PostSharp 注入(inject)对 aspect 的依赖

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

是否可以将依赖项注入(inject) PostSharp 方面?我想创建 NavigateBackAspect - 类似的东西:

[PSerializable]
class NavigateBackAspect : OnMethodBoundaryAspect
{
private readonly INavigationService _navigationService;

public NavigateBackAspect(INavigationService navigationService)
{
_navigationService = navigationService;
}

public override void OnExit(MethodExecutionArgs args)
{
base.OnExit(args);
var viewModel = args.Instance as Shared.ViewModel.ViewModel;

if (viewModel != null)
{
viewModel.Dispose();
_navigationService.GoBack();
}
}
}

但是我读到构造函数/参数注入(inject)是不可能的,因为构造函数在编译后只被调用一次。有任何解决方法吗?

最佳答案

这种事情是不可能的,主要是因为一般的属性和特殊的方面只能在构造函数中有常量表达式。

构造函数在编译期间为每个方面目标调用一次。在这发生之后,方面被序列化(连同它可能包含的任何内部数据)。它在运行时被反序列化,这意味着根本不调用构造函数。但是没有理由调用它;属性构造函数只能包含不易更改的常量数据。见约aspect lifetime here .

但是,每个方面目标仍然有自己的方面实例。这意味着您可以在 runtime initialization 期间执行此操作.您有几个选择:

  1. 向构造函数提供一个字符串键参数,然后在运行时使用该键(来自共享字典)查找适当的对象。
  2. 依靠切面类型拥有包含对象的属性或字段,并通过反射访问它。建议您在运行时初始化期间执行此操作,因为反射会导致性能问题。

关于c# - PostSharp 注入(inject)对 aspect 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350165/

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