我使用功能标志在不同的环境中选择性地启用/禁用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可以这样做:
- 添加一个
IPlanningStrategy
,用于对属性进行反射扫描(或ActionMethodSelectorAttribute
)。如果不是控制器,则立即返回 - 具有此属性的Foreach方法添加一个
IDirective
,该CCD_9包含对MethodInfo
的引用 - 添加使用
kernel.Inject(attribute)
注入属性的IActivationStrategy
最好看看Ninject的PropertyInjection
实现,它的工作原理正是这样。它只需要一些改变来做你想做的事。