我可以使用Ninject将依赖项注入到属性中,而不是使用服务定位器模式吗



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

为此,我想在关闭某些MVC操作方法相关的功能时禁用它们

// 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实际上不是一个过滤器,所以它不适用于这里。

属性由.NET Framework创建。所以不能进行构造函数注入。注入到Attributes中的仅有两种方法是执行PropertyInjection或ServiceLocation。

PropertyInjection可以这样做:

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

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

最新更新