面向现代 .NET 应用程序的轻量级生命周期与流程控制框架。
[WORKING IN PROGRESS]
添加依赖:
dotnet add package FlowNet.Core添加代码:
using FlowNet.Core;
using System.Threading.Tasks;
namespace YourApp.Namespace;
[Flow.Scope("app")]
public sealed partial class Program
{
// Start application by Flow.NET
public static Task Main() => FlowInterops.Initialize("app:start");
[Flow.Task]
public static async Task Start()
{
// 这个 Task 的全局标识是 app:start, 其中 start 是从方法名推断出来的
// 若要自定义标识, 可以使用 [Flow.Task("custom")]
// do something...
}
}然后就可以开始写业务逻辑了——就这么简单,简单到连 template 都不用。
将 Program 类改成这样:
using FlowNet.Core;
using System.Threading.Tasks;
namespace YourApp.Namespace;
[Flow.Scope("app")]
internal static partial class Program
{
// Run application based on flow control
public static Task Main() => FlowInterops.Run();
// Define base flows
[Flow.Task("run")] [Flow.Run]
[Flow.Task("loading:before")] [Flow.Run(After = "app:run")]
[Flow.Task("loading")] [Flow.Run(After = "app:loading:before")]
[Flow.Task("exit:before")] [Flow.Run(After = "app:loading")]
[Flow.Task("exit")] [Flow.Run(After = "app:exit:before")]
private static Task Wildcard() => Task.CompletedTask;
}使用 Flow.Run 标记来定义各流程间的依赖关系,例如:
using FlowNet.Core;
using System.Threading.Tasks;
namespace YourApp.Namespace;
[Flow.Scope("config")]
public sealed partial class ConfigService
{
[Flow.Task]
[Flow.Run(After = "app:loading", Before = "*:start")]
private static async Task _()
{
// 这是一个特殊的 Flow 任务,按照一般的标识符推断规则,它的标识符是空的
// 因此这个任务的全局标识就是外部 scope 的标识,即 config
// Initialize config service...
}
}Flow.NET 支持使用扩展向框架添加额外功能,你也可以开发自己的扩展,参考 FlowNet.ExampleExtension。
| 名称 | 功能 | 仓库 | 许可 |
|---|---|---|---|
| Flow.NET Collector | 基于自定义元注解的 IoC 组件收集 | ruattd/FlowNet.Collector | Apache 2.0 |
| Flow.NET Logging | 可扩展的日志工具 | ruattd/FlowNet.Logging | Apache 2.0 |