C# 后向方面注入依赖

C# 后向方面注入依赖,c#,postsharp,C#,Postsharp,是否可以将依赖注入PostSharp方面? 我想创建NavigateBackAspect-类似于: [PSerializable] class NavigateBackAspect : OnMethodBoundaryAspect { private readonly INavigationService _navigationService; public NavigateBackAspect(INavigationService navigationService)

是否可以将依赖注入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();
        }
    }
}

然而,我已经读到,构造函数/参数注入是不可能的,因为编译后只调用一次构造函数。有什么解决方法吗?

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

在编译期间,每个aspected目标调用一次构造函数。发生这种情况后,将序列化该方面(以及它可能包含的任何内部数据)。它在运行时被反序列化,这意味着根本不调用构造函数。但是没有理由叫它;属性构造函数只能包含不易更改的常量数据。看看

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

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

  • 这里给出了这个问题的答案:@gaelfrateur与这个问题无关。但是,fex,您可能应该改写这个问题,而不使用短语“依赖注入”,因为它通常指各种IoC框架。正确。心理冲突——我只是碰巧回顾了这个反应。但那又如何: