c# - .net Core 中的自定义属性设置
问题描述
我正在编写一个非常简单的自定义属性,以便与我的 ASP.net Core 方法一起使用。该属性用于处理指示端点方法“打开或关闭”的功能标志,如下所示:
1)如果一个特性被打开,允许代码通过该方法并正常执行它。2)如果特性被关闭,只从属性返回,不要执行里面的方法
我在想这样的事情:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class FeatureFlagAttribute : ActionFilterAttribute
{
private Dictionary<string, bool> myFeaturesList;
private readonly string selectedFeature;
public FeatureFlagAttribute(string featureName)
{
selectedFeature = featureName;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var found = myFeaturesList.TryGetValue(selectedFeature, out var result);
if (!found || !result)
{
// dont continue
context.HttpContext.Response.StatusCode = 403;
}
}
}
我需要myFeaturesList
填充它才能工作,但我不想每次使用它时都将它传递给构造函数。配置它的最佳方法是什么?我正在考虑在属性中设置一个静态属性,但认为这有点蹩脚的方法,必须有更好的方法。提前致谢!
解决方案
或者,您可以将 的创建提取featureNames
到可注入服务(注册到 DI)中,并将您的属性用作类型过滤器或使用IFilterFactory
.
使用类型过滤器,您可以将属性创建为:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class FeatureFlagAttribute : ActionFilterAttribute
{
private readonly string _featureName;
private readonly IFeatureService _featureService;
public FeatureFlagAttribute(string featureName, IFeatureService featureService)
{
_featureName = featureName;
_featureService = featureService;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var features = _featureService.GetMyFeatures();
var found = features.TryGetValue(_featureName, out var result);
if (!found || !result)
{
// don't continue
context.HttpContext.Response.StatusCode = 403;
}
}
}
在构造函数参数中,featureName
保持不变,并且需要定义到属性,而featureService
将从 DI 中得到解析,因此您需要在启动的ConfigureServices()
.
属性用法随着类型过滤器的变化而有所改变,例如:
[TypeFilter(typeof(FeatureFlagAttribute), Arguments = new object[] { "feature-A" })]
public IActionResult Index()
{
return View();
}
您可以在文档中阅读更多将依赖项注入过滤器的选项: https ://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2#dependency-injection
推荐阅读
- c - autoconf:在 `configure.ac` 中包含 `libftdi` 的最佳实践
- r - 在其他列上添加列条件
- python - 如何在 Python / Jupyter 中从 DataFrame 中分离一列?
- java - 如果唯一的区别是 for 循环中的方法调用,请避免重复代码
- python - 如何将列中的字符串转换为数据框中的不同列?
- c++ - 编译器会优化 for 循环以匹配总线宽度吗?
- sql - 从所有选定列的左右删除空格(TRIM)
- scala - akka Actor 中的可变集合返回 NullPointerException
- php - 为多对多关系播种 Faker 工厂模型
- d3.js - 如何在 Plotly 中使用 D3 分层边捆绑图