3

我正在使用功能标志在不同的环境中选择性地启用/禁用我的 MVC4 Web 应用程序的某些方面。我有一个以提供对这些标志的访问IConfiguration的方法命名的接口。IsEnabled(FeatureFlag)

为此,我想在它们相关的功能关闭时禁用某些 MVC 操作方法。我有一个名为的属性FeatureAttribute定义如下:

// Usage: [Feature(FeatureFlag.I18N)]
public class FeatureAttribute : ActionMethodSelectorAttribute {
    private IConfiguration _config;
    private FeatureFlag _feature;

    public FeatureAttribute(FeatureFlag feature) {
        _config = DependencyResolver.Current.GetService<IConfiguration>();
        _feature = feature;
    }
    public override bool IsValidForRequest(ControllerContext controllerContext,
                                           MethodInfo methodInfo) {
        return _config.IsEnabled(_feature);
    }
}

这行得通,DependencyResolver用来获得一个IConfiguration有趣的气味的实例。有什么办法可以重新设计我的代码以避免服务定位器模式?

我最初想到使用过滤器注入,但ActionMethodSelectorAttribute实际上不是过滤器,所以它不适用于这里。

4

1 回答 1

2

属性由 .NET Framework 创建。所以你不能做构造函数注入。注入属性的唯一两种方法是执行 PropertyInjection 或 ServiceLocation。

PropertyInjection 可以这样完成:

  1. 添加一个IPlanningStrategy对您的属性(或ActionMethodSelectorAttribute)进行反射的扫描。如果不是控制器,请立即返回。
  2. 具有此属性的 Foreach 方法添加一个IDirective包含对MethodInfo
  3. 添加使用.IActivationStrategy注入属性的 A。kernel.Inject(attribute)

最好看看PropertyInjectionNinject 的实现,它的工作原理就是这样。它只需要一些改变来做你想做的事。

于 2013-08-09T00:37:20.310 回答