.NET应用如何优雅的实现功能定时开关

DotNetCore实战

共 1631字,需浏览 4分钟

 ·

2020-12-04 17:21

eabc2da18d5f429f669d092f7b496d48.webp


导语

我们在打工的时候,总能遇到一种类型的需求:“我想要这个活动广告在双11期间才显示”,“我想要这个API在20号以后才开放”,可能你觉得这个需求没什么难的,写个时间判断不就行了?但是这么做并不优雅,如果你的系统里有诸如此类的其他功能也需要时间段控制,那么你的代码将像咖喱?一样涂满厕所。今天分享一个优雅的小技巧,可以不写任何 if,动态灵活的配置功能定时开关。

9c51ac072b9201bc0cf09d8209ebcecf.webp

本文的内容是对前篇《.NET 应用如何优雅的做功能开关》的补充。因此请先阅读前文,了解相关库的用法。

FeatureFilter


FeatureManagement 库提供了两种 Filter:百分比(Percentage)、时间窗口(TimeWindow)。我们这里使用的就是 TimeWindowFilter。

配置文件

之前我们的功能开关只是简单的true或false。要使用Filter,需要在功能名称下定义 EnabledFor。例如此处的 TimeWindow。

"FeatureManagement": {

  "Fubao": {

    "EnabledFor": [

      {

        "Name": "TimeWindow",

        "Parameters": {

          "Start": "11/20/2020 00:00:00 GMT",

          "End": "11/30/2020 00:00:00 GMT"

        }

      }

    ]

  }

}

我定义了一个名为 Fubao 的功能,让它在 GMT 时间 2020年11月20日到11月30日之间打开。

依赖注入

之前我们不使用 Filter 的时候,DI 里只要加入下面这行代码就可以了。

services.AddFeatureManagement();

为了使用 Filter,我们现在还得加上对应的 Filter 类型。例如此处的 TimeWindowFilter 类型。

services.AddFeatureManagement().AddFeatureFilter();

样例视图

Feature 的用法和之前没有区别,在视图里仍然可以用 taghelper,例如:

   

年轻的时候不996,什么时候可以?

今天是11月21日,程序运行起来后,符合显示条件。

4a88af1b86bcffbacbc26eeeea214380.webp

如果我们把时间段改到今天之前,福报就消失了。

9e894ba9e2afa2933f2a2d15a5e06edc.webp

在 Controller / Action 以及代码里用 Feature 开关的方法见前文

小提示


由于 TimeWindow 的时间属性是 DateTimeOffset? 类型的,因此我们没法配置具体时区(如中国 CST)的时间,必须人肉转换为 GMT 时间才行。

当然,如果你愿意自己996实现一个带时区的 Filter,可以参考微软开源代码:

https://github.com/microsoft/FeatureManagement-Dotnet/tree/main/src/Microsoft.FeatureManagement/FeatureFilters


往期精彩回顾



【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报