ResultCQRS.Autofac 1.0.9

dotnet add package ResultCQRS.Autofac --version 1.0.9
NuGet\Install-Package ResultCQRS.Autofac -Version 1.0.9
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="ResultCQRS.Autofac" Version="1.0.9" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ResultCQRS.Autofac --version 1.0.9
#r "nuget: ResultCQRS.Autofac, 1.0.9"
#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 ResultCQRS.Autofac as a Cake Addin
#addin nuget:?package=ResultCQRS.Autofac&version=1.0.9

// Install ResultCQRS.Autofac as a Cake Tool
#tool nuget:?package=ResultCQRS.Autofac&version=1.0.9

ResultCQRS

Build Status

Library featuring CQRS pattern and mediator implementations in conjuction with functional Results to achieve exception-safe operations.

Uses a functional Result approach for failure-prone operations.

To utilize all features using Autofac is required.

Features

  • ICommand and IQuery abstractions
  • ICommandHandler and IQueryHandler abstractions
  • ICommandDispatcher and IQueryDispatcher abstractions and default implementations
  • Supports decorators and adapters via Autofac's methods (for decorators with Microsoft's DI you may consider something like Scrutor)

Description

For both commands and queries, there are two return options - one that only returns a Result and one that returns an additional entity/DTO contained within the Result.

Every handler must return a Result struct which determines whether the operation succedeed or not, handlers may or may not return additional results contained within the Result struct.

Installation

To register the library with the DI container use the ContainerBuilder or IServiceCollection extension methods provided by the library:

builder.AddResultCQRS(assembliesToScan);

To register decorators (or adapters) use:

  1. the attributes provided by AttributeBasedRegistration
  2. or directly through Autofac, Scrutor or other libraries providing DI decoration support.

If you're using Autofac (or built-in attribute based Autofac) - you can register multiple decorators and they'll be applied in the order that you register them - read more at Autofac's docs regarding decorators and adapters.

Documentation

Documentation available at https://docs.result-cqrs.mikym.me/.

Example usage

Library offers a simple error catching and logging within the provided default Dispatcher implementations.

A command without a concrete result:

public record SimpleCommand : ICommand
{
    public bool IsSuccess { get; }
    
    public SimpleCommand(bool isSuccess = true)
        => IsSuccess = isSuccess;
}

And a handler that handles it:

public class SimpleCommandHandler : ICommandHandler<SimpleCommand>
{
    public async Task<Result> HandleAsync(SimpleCommand command)
    {
        if (command.IsSuccess)
            return Result.FromSuccess();
            
        return new InvalidOperationError();
    }
}

A command with a concrete result:

public record SimpleCommandWithConcreteResult : ICommand<int>
{
    public bool IsSuccess { get; }
    
    public SimpleCommandWithConcreteResult(bool isSuccess = true)
        => IsSuccess = isSuccess;
}

And a handler that handles it:

public class SimpleCommandHandlerWithConcreteResult : ICommandHandler<SimpleCommandWithConcreteResult, int>
{
    public async Task<Result<int>> HandleAsync(SimpleCommandWithConcreteResult command)
    {
        if (command.IsSuccess)
            return 1;
            
        return new InvalidOperationError();
    }
}

Then in your service you can use:

public class Service : IService
{
    private readonly ICommandDispatcher _commandDispatcher;

    public Service(ICommandDispatcher commandDispatcher)
        => _commandDispatcher = commandDispatcher;

    public async Task<Result> DoAsync()
    {
        var result = await _commandDispatcher.DispatchAsync(command)
            
        return new InvalidOperationError();
    }
}

Using queries is pretty much same.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.9 157 8/18/2023
1.0.8 136 8/8/2023
1.0.7 157 7/10/2023
1.0.6 120 6/25/2023
1.0.5 120 5/10/2023
1.0.4 159 4/5/2023
1.0.3 145 4/5/2023
1.0.2 149 4/4/2023
1.0.1 162 4/4/2023
1.0.0 168 4/4/2023