FeatureSlice.FluentServiceBus 1.0.7

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

// Install FeatureSlice.FluentServiceBus as a Cake Tool
#tool nuget:?package=FeatureSlice.FluentServiceBus&version=1.0.7                

FeatureSlice

Release Status NuGet Version NuGet Downloads

FeatureSlice is an library aiming to help working with Vertical/Feature Slice Architecture.

FeatureSlices contain a Handle method that can be invoked externaly by a delegate registered in DI. The method can can be extended so it can be invoked by:

  • Http Endpoint
  • Queue/Topic
  • Background Job
  • CLI

Those elements can be setup using two types of API:

Samples

Endpoint

public sealed record ExampleHandler() : FeatureSlice<ExampleHandler.Request, ExampleHandler.Response>
(
    Handle(static async (Request request, Dependency1 dep1, Dependency2 dep2) =>
    {
        Console.WriteLine($"Handler: {request}");

        await Task.CompletedTask;

        return new Response(request.Value2, request.Value1, request.Value0);
    })
    .MapPost("handler", opt => opt
        .Request
        (
            From.Route.Int("id"),
            From.Query.Int("qu"),
            From.Body.Json<Request>(),
            (id, qu, body) => new Request(body.Value0, qu, id)
        )
        .DefaultResponse()
        .WithTags("Handler"))
)
{
    public sealed record Request(string Value0, int Value1, int Value2);
    public sealed record Response(int Value0, int Value1, string Value2);
}

CronJob


public sealed record ExampleHandler() : FeatureSlice<ExampleHandler.Request, ExampleHandler.Response>
(
    Handle(static async (Request request, Dependency1 dep1, Dependency2 dep2) =>
    {
        Console.WriteLine($"Handler: {request}");

        await Task.CompletedTask;

        return new Response(request.Value2, request.Value1, request.Value0);
    })
    .MapCronJob
    (
        "5 4 * * *",
        new Request("testjob", 1, 2)
    )
)
{
    public sealed record Request(string Value0, int Value1, int Value2);
    public sealed record Response(int Value0, int Value1, string Value2);
}

Consumer

public sealed record ExampleConsumer() : FeatureSlice<ExampleConsumer.Request>
(
    Handle(static async (Request request, Dependency1 dep1, ExampleHandler dep2) => 
    {
        Console.WriteLine($"Consumer: {request}");

        await dep2.Dispatch(new ExampleHandler.Request("testFromConsumer", 0, 1));

        await Task.CompletedTask;

        return Result.Success;
    })
    .AsConsumer("ConsumerName")
}

CLI

public sealed record ExampleHandler() : FeatureSlice<ExampleHandler.Request, ExampleHandler.Response>
(
    Handle(static async (Request request, Dependency1 dep1, Dependency2 dep2) =>
    {
        Console.WriteLine($"Handler: {request}");

        await Task.CompletedTask;

        return new Response(request.Value2, request.Value1, request.Value0);
    })
    .MapCli
    (
        Arg.Cmd("validate"),
        Arg.Opt("option1", "o1"),
        Arg.Opt("option2", "o2"),
        (arg1, arg2) => new Request(arg1, int.Parse(arg2), 5)   
    )
)
{
    public sealed record Request(string Value0, int Value1, int Value2);
    public sealed record Response(int Value0, int Value1, string Value2);
}

Combination of all of those


public sealed record ExampleConsumer() : FeatureSlice<ExampleConsumer.Request>
(
    Handle(static async (Request request, Dependency1 dep1, ExampleHandler dep2) => 
    {
        Console.WriteLine($"Consumer: {request}");

        await dep2.Dispatch(new ExampleHandler.Request("testFromConsumer", 0, 1));

        await Task.CompletedTask;

        return Result.Success;
    })
    .MapPost("consumer", opt => opt
        .Request
        (
            From.Route.Int("id"),
            From.Body.Json<Request>(),
            (id, body) => new Request(body.Value0, id)
        )
        .DefaultResponse()
        .WithTags("Consumer"))

    .MapCronJob
    (
        "5 4 * * *",
        new Request("testjob", 1, 2)
    )
    .MapCli
    (
        Arg.Cmd("validate"),
        Arg.Opt("option1", "o1"),
        Arg.Opt("option2", "o2"),
        (arg1, arg2) => new Request(arg1, int.Parse(arg2), 5)   
    )
)
{
    public sealed record Request(string Value0, int Value1, int Value2);
    public sealed record Response(int Value0, int Value1, string Value2);
}

FeatureSlices Expose Dispatch methods which allow them to be called from dependencies

public static void Use
(
    ExampleConsumer consumer,
    ExampleHandler handler
)
{
    consumer.Dispatch(new ExampleConsumer.Request("testConsumer", 1));
    handler.Dispatch(new ExampleHandler.Request("testHandler", 2, 3));
}

FeatureSlices Expose Register for DI registration

public static void Register(IServiceCollection services, string[] args)
{
    services.AddFeatureSlices()
        .DefaultConsumerDispatcher()
        .DefaultDispatcher()
        .MapCli(args);

    services.AddFeatureSlice<ExampleHandler>();
    services.AddFeatureSlice<ExampleConsumer>();
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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.7 73 8/1/2024
1.0.6 80 7/30/2024
1.0.5 80 7/30/2024
1.0.4 90 7/22/2024
1.0.3 128 4/6/2024
1.0.2 128 3/6/2024
1.0.1 116 2/23/2024