PostSharp注入对方面的依赖

时间:2014-06-22 10:04:27

标签: c# postsharp

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

但是我已经读过构造函数/参数注入是不可能的,因为构造函数在编译后只调用一次。有没有解决方法?

1 个答案:

答案 0 :(得分:3)

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

在编译期间,每个预期目标都会调用一次构造函数。发生这种情况后,方面将被序列化(以及它可能包含的任何内部数据)。它在运行时被反序列化,这意味着根本不调用构造函数。但它没有理由被称为;属性构造函数只能包含不易变化的常量数据。请参阅aspect lifetime here

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

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