ExeCutor 1.0.1
dotnet add package ExeCutor --version 1.0.1
NuGet\Install-Package ExeCutor -Version 1.0.1
<PackageReference Include="ExeCutor" Version="1.0.1" />
paket add ExeCutor --version 1.0.1
#r "nuget: ExeCutor, 1.0.1"
// Install ExeCutor as a Cake Addin
#addin nuget:?package=ExeCutor&version=1.0.1
// Install ExeCutor as a Cake Tool
#tool nuget:?package=ExeCutor&version=1.0.1
ExeCutor
A simple component that implements CQRS pattern in .NET.
ExeCutor uses mediatoR component to create handlers for commands and events.
The main goal is bringing an abstraction with Standardized Interfaces to implements commands and integration events as well.
The package is built in .NET STANDARD 2.0 to enable your utilization in .NET FRAMEWORK and .NET CORE.
Get Started
Create a simple Command
using ExeCutor; namespace CQRSImageDetails.Commands { public class RemoveImageCommand : ICommand { public int Id { get; set; } } }
Create a Handler to you Command
using ExeCutor; using CQRSImageDetails.Repository; using System.Threading; using System.Threading.Tasks; namespace CQRSImageDetails.Commands { public class RemoveImageCommandHandler : CommandHandler<RemoveImageCommand> { private readonly RepositoryPostgres _repository; public RemoveImageCommandHandler() { _repository = new RepositoryPostgres(); } public override Task<CommandResponse> HandleExecution(RemoveImageCommand command, CancellationToken cancellationToken) => Task.Run<CommandResponse>(() => { return new CommandResponse { OK = _repository.DeleteImageDetails(command.Id) }; }); } }
Using it with .NET FRAMEWORK
A pre requirement to create an instance of executor that will enable you to send a Command or publish an Event is work with a container to register all Handlers of your application.
The mediator also requires a container to register your interfaces.
If you already use a container IOC in your project, just use it, but if not use I have a sample how to register with AutoFac component.
Bellow we have a helper using AutoFac to register all Handler and your respective dependencies.
private static void UseServices(Type[] commands,
Type[] events,
Action<Executor> configureExecutor)
{
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();
builder.RegisterType<Executor>();
void registerHandler(Assembly assemblyHandler, Type typeHandler)
{
var registredHandler = builder
.RegisterAssemblyTypes(assemblyHandler);
registredHandler.AsClosedTypesOf(typeHandler);
registredHandler.AsImplementedInterfaces();
}
foreach (var commandHandler in commands)
registerHandler(commandHandler.GetTypeInfo().Assembly, typeof(IRequestHandler<,>));
foreach (var eventHandler in events)
registerHandler(eventHandler.GetTypeInfo().Assembly, typeof(INotificationHandler<>));
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
var container = builder.Build();
container.Resolve<IMediator>();
if (configureExecutor != null)
configureExecutor.Invoke(container.Resolve<Executor>());
}
Now we can use the helper above
Executor executorInstance = null;
UseServices(
new Type[]
{
typeof(CreateNewImageCommand),
typeof(RemoveImageCommand)
},
new Type[]
{
typeof(ImageCreatedEvent)
},
(Executor instance) => { executorInstance = instance; }
);
After registration steps, just create the commands and events and use executor instance to send a command or publish an event.
await executorInstance.Send(new RemoveImageCommand { Id = 1 });
The complete sample solution is here.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- MediatR (>= 8.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.1 | 940 | 6/29/2020 |
1.0.1-alpha1 | 417 | 7/4/2020 |
1.0.1-alpha0 | 286 | 7/4/2020 |
1.0.0 | 455 | 6/28/2020 |