Darker alternatives and similar packages
Based on the "Queue" category.
Alternatively, view Darker alternatives based on common mentions on social networks and blogs.
-
Hangfire
An easy way to perform background job processing in .NET and .NET Core applications. No Windows Service or separate process required -
CAP
Distributed transaction solution in micro-service base on eventually consistency, also an eventbus with Outbox pattern -
Confluent's .NET Client for Apache KafkaTM
Confluent's Apache Kafka .NET client -
NServiceBus
Build, version, and monitor better microservices with the most powerful service platform for .NET -
RabbitMQ.NET
RabbitMQ .NET client for .NET Standard 2.0+ and .NET 4.6.1+ -
CQRSlite
A lightweight framework to help creating CQRS and Eventsourcing applications in C# -
Kafka Client
.Net implementation of the Apache Kafka Protocol that provides basic functionality through Producer/Consumer classes. -
Gofer.NET
Easy C# API for Distributed Background Tasks/Jobs for .NET Core. -
RestBus
Easy, Service Oriented, Asynchronous Messaging and Queueing for .NET -
SlimMessageBus
Lightweight message bus interface for .NET (pub/sub and request-response) with transport plugins for popular message brokers. -
Silverback
Silverback is a simple but feature-rich message bus for .NET core (it currently supports Kafka, RabbitMQ and MQTT). -
Enexure.MicroBus
MicroBus is a simple in process Mediator for .NET
Access the most powerful time series database as a service
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of Darker or a related project?
README
Darker
The query-side counterpart of Brighter.
Usage with ASP.NET Core
In your ConfigureServices
method, use AddDarker
to add Darker to the container.
ASP.NET Core integration is provided by the Paramore.Darker.AspNetCore package.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Darker and some extensions.
services.AddDarker()
.AddHandlersFromAssemblies(typeof(GetPeopleQueryHandler).Assembly)
.AddJsonQueryLogging()
.AddDefaultPolicies();
// Add framework services.
services.AddMvc();
}
WARNING if you are using EFCore the DBContext DI Lifetime is scoped, for Darker to play nicely with EFCore and DI the QueryProcessor must also be registration as Scoped
services.AddDarker(options =>
{
//EFCore by default registers Context as scoped, which forces the QueryProcessorLifetime to also be scoped
options.QueryProcessorLifetime = ServiceLifetime.Scoped;
})
This example uses the request logging integration provided by Paramore.Darker.QueryLogging and policy integration provided by Paramore.Darker.Policies. Have a look at the Startup.ConfigureServices method in the SampleApi project for more examples on how to use the integrations.
Inject IQueryProcessor
and call Execute
or ExecuteAsync
to dispatch your query to the registered query handler.
using Paramore.Darker;
using Microsoft.AspNetCore.Mvc;
using System.Threading;
using System.Threading.Tasks;
public class FooController : ControllerBase
{
private readonly IQueryProcessor _queryProcessor;
public FooController(IQueryProcessor queryProcessor)
{
_queryProcessor = queryProcessor;
}
public async Task<IActionResult> Get(CancellationToken cancellationToken = default(CancellationToken))
{
var query = new GetFoo(42);
var result = await _queryProcessor.ExecuteAsync(query, cancellationToken);
return Ok(result);
}
}
using Paramore.Darker;
public sealed class GetFoo : IQuery<string>
{
public int Number { get; }
public GetFoo(int number)
{
Number = number;
}
}
Implement either QueryHandler<,>
or QueryHandlerAsync<,>
depending on whether you wish to execute your queries synchronously or asynchronously.
For most control, you can also implement IQueryHandler<,>
directly.
using Paramore.Darker;
using Paramore.Darker.Attributes;
using Paramore.Darker.Policies;
using Paramore.Darker.QueryLogging;
using System.Threading;
using System.Threading.Tasks;
public sealed class GetFooHandler : QueryHandlerAsync<GetFoo, string>
{
[QueryLogging(1)]
[FallbackPolicy(2)]
[RetryableQuery(3)]
public override async Task<string> ExecuteAsync(GetFoo query, CancellationToken cancellationToken = default(CancellationToken))
{
return await FetchFooForNumber(query.Number, cancellationToken);
}
}
Usage without ASP.NET
Register your queries and handlers with QueryHandlerRegistry
and use QueryProcessorBuilder
to configure and build a IQueryProcessor
.
var registry = new QueryHandlerRegistry();
registry.Register<GetFoo, string, GetFooHandler>();
IQueryProcessor queryProcessor = QueryProcessorBuilder.With()
.Handlers(registry, Activator.CreateInstance, t => {}, Activator.CreateInstance)
.InMemoryQueryContextFactory()
.Build();
Instead of Activator.CreateInstance
, you can pass any factory Func<Type, object>
to constuct handlers and decorator.
Integrations with some DI frameworks are available, for example SimpleInjector, as provided by the Paramore.Darker.SimpleInjector package:
var container = new Container();
var queryProcessor = QueryProcessorBuilder.With()
.SimpleInjectoHandlers(container, opts =>
opts.WithQueriesAndHandlersFromAssembly(typeof(GetPeopleQuery).Assembly))
.InMemoryQueryContextFactory()
.Build();
container.Register<IQueryProcessor>(queryProcessor);
In this case you don't need to manually register queries or handlers as the integration allows scanning assemblies for matching types.