请注意,可以在帮助网站上找到包括指南和 API 参考的完整文档。
我还在我的博客上发布了一系列关于从“洋葱层”架构转向使用中介命令模式的系列文章。
AzureFromTheTrenches.Commanding 是一个基于配置的异步命令中介框架,具有许多关键设计目标:
为了支持这些目标,该框架支持 .NET Standard 2.0(及更高版本),因此可以在各种场景中使用,并且可以使用许多完全可选的扩展包来启用:
您不需要利用该功能,但如果您愿意,您可以随着时间的推移采用它,而无需更改核心代码。
首先安装nuget包用于命令:
Install-Package AzureFromTheTrenches.Commanding
作为示例,让我们创建一个将两个数字相加并返回结果的命令:
public class MathResult
{
public int Value { get; set; }
}
public class AddCommand : ICommand
{
public int FirstNumber { get; set; }
public int SecondNumber { get; set; }
}
命令由处理程序执行,我们的添加处理程序如下所示:
public AddCommandHandler : ICommandHandler
{
public Task ExecuteAsync(AddCommand command, MathResult previousResult)
{
return new MathResult {
Value = command.FirstNumber + command.SecondNumber
};
}
}
定义了命令、结果和处理程序后,我们需要将它们注册到命令系统。如果您只是编写一个控制台应用程序,您可以在 Program.cs 中执行此操作,但为了更实际的使用,您可以在配置 IoC 容器时执行此操作 - 将命令注册视为应用程序配置的另一部分很方便,除此之外,您还需要访问该容器。下面的示例演示了向 Microsoft ASP.Net Core 服务提供商注册:
// First register the commanding framework with the IoC container
IServiceProvider serviceProvider = null;
IServiceCollection serviceCollection = new ServiceCollection();
CommandingDependencyResolverAdapter adapter = new CommandingDependencyResolverAdapter(
(fromType, toInstance) => services.AddSingleton(fromType, toInstance),
(fromType, toType) => services.AddTransient(fromType, toType),
(resolveTo) => _serviceProvider.GetService(resolveTo));
ICommandRegistry registry = adapter.AddCommanding();
serviceProvider = serviceCollection.BuildServiceProvider();
// Now register our handler
registry.Register();
CommandingDependencyResolverAdapter类是一个适配器,允许框架向任何 IoC 容器注册, AddCommanding方法注册可注入的命令接口并返回一个ICommandRegistry接口,该接口允许您注册处理程序 - 您只需要注册一个处理程序,框架就会计算其余部分和注册使用流畅的 API 风格来实现简洁可读的代码。
为了调度我们的命令,我们需要获取 ICommandDispatcher 接口并发送命令。我们将这样做并将结果输出到控制台:
ICommandDispatcher commandDispatcher = dependencyResolver.ServiceProvider.GetService();
MathResult mathResult = await commandDispatcher.DispatchAsync(new AddCommand { FirstNumber = 5, SecondNumber = 6});
Console.WriteLine(mathResult.Value); // hopefully says 11
对于简单的用法来说就是这样。这个例子有点人为,因为我们手动解决依赖关系,并且有很多样板将两个数字相加,但在现实世界中,您真正需要做的就是在适当的位置注册您的命令处理程序,例如,如果您正在使用 ASP.Net Core,那么所有依赖项注入样板都已就位。
简单的内存命令执行 https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/InMemoryCommanding
通过 HTTP 调度命令 https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/HttpCommanding.Client
执行命令以响应 HTTP 请求 (ASP.Net Core) https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/HttpCommanding.Web
调度到 Azure 存储队列并从中执行 https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/AzureStorageQueueCommanding
Azure 存储审核 https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/AzureStorageAuditing
Azure 事件中心审核 https://github.com/JamesRandall/AzureFromTheTrenches.Commanding/tree/master/Samples/AzureEventHubAuditing
更多使用场景可以在 wiki 中找到,包括:
如果您遇到困难,请记录 GitHub 问题或通过 Twitter @azuretrenches 联系我,我会尽可能提供帮助。