ExeCutor 1.0.1

dotnet add package ExeCutor --version 1.0.1
NuGet\Install-Package ExeCutor -Version 1.0.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ExeCutor" Version="1.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ExeCutor --version 1.0.1
#r "nuget: ExeCutor, 1.0.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// 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

  1. Create a simple Command

    using ExeCutor;
    
    namespace CQRSImageDetails.Commands
    {
        public class RemoveImageCommand : ICommand
        {
            public int Id { get; set; }
        }
    }
    
  2. 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

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