Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
2b9dc8a
feat(core): add file watcher service and object pool
tgiachi Jun 26, 2026
6b911e9
feat(services-core): add RegisterFileWatcherService DI extension
tgiachi Jun 26, 2026
a63ae71
refactor: convert remaining extensions to C# 14 extension members
tgiachi Jun 26, 2026
5f24162
feat(core): add command dispatcher contracts and result records
tgiachi Jun 26, 2026
1e63729
feat(services-core): add CommandDispatcher with fan-out, fault isolat…
tgiachi Jun 26, 2026
fea17c8
test(services-core): cover context-factory dispatch
tgiachi Jun 26, 2026
9cc5e04
feat(services-core): DI-native command handler auto-subscription
tgiachi Jun 26, 2026
4cf680d
docs: document the command dispatcher in Core and Services.Core READMEs
tgiachi Jun 26, 2026
0aaa0dd
docs(samples): add runnable command dispatcher sample
tgiachi Jun 26, 2026
0ee97cc
build: bump YamlDotNet to 18.1.0
tgiachi Jun 27, 2026
bcac00f
feat(services-core): add seeded command dispatch from a seed
tgiachi Jun 27, 2026
3dd70bc
refactor(commands): drop parameterless context factory in favor of ex…
tgiachi Jun 27, 2026
303891c
feat(core): standardize crypto, TLS certificate, and RNG helpers
tgiachi Jun 27, 2026
7ae3507
feat(actors): scaffold SquidStd.Actors module
tgiachi Jun 27, 2026
b381102
feat(actors): add actor options and policy enums
tgiachi Jun 27, 2026
dfbf0d4
feat(actors): add typed request contracts and ActorRequest base record
tgiachi Jun 27, 2026
69f260b
feat(actors): add Actor base with FIFO mailbox, TellAsync, overflow p…
tgiachi Jun 27, 2026
fab442c
test(actors): cover Ask reply, timeout, and dispose faulting of pendi…
tgiachi Jun 27, 2026
440b58c
test(actors): cover isolate, ask exception propagation, and stop-on-e…
tgiachi Jun 27, 2026
632d9a3
feat(actors): add EventBus-to-mailbox subscription adapter
tgiachi Jun 27, 2026
97aea99
docs(actors): add SquidStd.Actors module README
tgiachi Jun 27, 2026
2aa2f01
fix(actors): fault queued requests on stop-on-error and carry the can…
tgiachi Jun 27, 2026
9a01f26
Merge branch 'feature/actors-mailbox' into develop
tgiachi Jun 27, 2026
a931ad1
style: configure ReSharper member layout (Dispose last) and apply jb …
tgiachi Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 54 additions & 52 deletions SquidStd.slnx
Original file line number Diff line number Diff line change
@@ -1,60 +1,62 @@
<Solution>
<Folder Name="/src/">
<Project Path="src/SquidStd.Abstractions/SquidStd.Abstractions.csproj"/>
<Project Path="src/SquidStd.Generators/SquidStd.Generators.csproj"/>
<Project Path="src/SquidStd.Telemetry.Abstractions/SquidStd.Telemetry.Abstractions.csproj"/>
<Project Path="src/SquidStd.Telemetry.OpenTelemetry/SquidStd.Telemetry.OpenTelemetry.csproj"/>
<Project Path="src/SquidStd.Aws.Abstractions/SquidStd.Aws.Abstractions.csproj"/>
<Project Path="src/SquidStd.AspNetCore/SquidStd.AspNetCore.csproj"/>
<Project Path="src/SquidStd.Caching.Abstractions/SquidStd.Caching.Abstractions.csproj"/>
<Project Path="src/SquidStd.Caching.Redis/SquidStd.Caching.Redis.csproj"/>
<Project Path="src/SquidStd.Caching/SquidStd.Caching.csproj"/>
<Project Path="src/SquidStd.Core/SquidStd.Core.csproj"/>
<Project Path="src/SquidStd.Database.Abstractions/SquidStd.Database.Abstractions.csproj"/>
<Project Path="src/SquidStd.Database/SquidStd.Database.csproj"/>
<Project Path="src/SquidStd.Messaging.Abstractions/SquidStd.Messaging.Abstractions.csproj"/>
<Project Path="src/SquidStd.Messaging.RabbitMq/SquidStd.Messaging.RabbitMq.csproj"/>
<Project Path="src/SquidStd.Messaging.Sqs/SquidStd.Messaging.Sqs.csproj"/>
<Project Path="src/SquidStd.Messaging/SquidStd.Messaging.csproj"/>
<Project Path="src/SquidStd.Network/SquidStd.Network.csproj"/>
<Project Path="src/SquidStd.Persistence.Abstractions/SquidStd.Persistence.Abstractions.csproj"/>
<Project Path="src/SquidStd.Persistence/SquidStd.Persistence.csproj"/>
<Project Path="src/SquidStd.Persistence.MessagePack/SquidStd.Persistence.MessagePack.csproj"/>
<Project Path="src/SquidStd.Plugin.Abstractions/SquidStd.Plugin.Abstractions.csproj"/>
<Project Path="src/SquidStd.Scripting.Lua/SquidStd.Scripting.Lua.csproj"/>
<Project Path="src/SquidStd.Services.Core/SquidStd.Services.Core.csproj"/>
<Project Path="src/SquidStd.Storage.Abstractions/SquidStd.Storage.Abstractions.csproj"/>
<Project Path="src/SquidStd.Storage.S3/SquidStd.Storage.S3.csproj"/>
<Project Path="src/SquidStd.Storage/SquidStd.Storage.csproj"/>
<Project Path="src/SquidStd.Templating/SquidStd.Templating.csproj"/>
<Project Path="src/SquidStd.Workers.Abstractions/SquidStd.Workers.Abstractions.csproj"/>
<Project Path="src/SquidStd.Workers/SquidStd.Workers.csproj"/>
<Project Path="src/SquidStd.Workers.Manager/SquidStd.Workers.Manager.csproj"/>
<Project Path="src/SquidStd.Templates/SquidStd.Templates.csproj"/>
<Project Path="src/SquidStd.Search.Abstractions/SquidStd.Search.Abstractions.csproj"/>
<Project Path="src/SquidStd.Search.Elasticsearch/SquidStd.Search.Elasticsearch.csproj"/>
<Project Path="src/SquidStd.Mail.Abstractions/SquidStd.Mail.Abstractions.csproj"/>
<Project Path="src/SquidStd.Mail.MailKit/SquidStd.Mail.MailKit.csproj"/>
<Project Path="src/SquidStd.Mail.Queue/SquidStd.Mail.Queue.csproj"/>
<Project Path="src/SquidStd.Abstractions/SquidStd.Abstractions.csproj" />
<Project Path="src/SquidStd.Generators/SquidStd.Generators.csproj" />
<Project Path="src/SquidStd.Telemetry.Abstractions/SquidStd.Telemetry.Abstractions.csproj" />
<Project Path="src/SquidStd.Telemetry.OpenTelemetry/SquidStd.Telemetry.OpenTelemetry.csproj" />
<Project Path="src/SquidStd.Aws.Abstractions/SquidStd.Aws.Abstractions.csproj" />
<Project Path="src/SquidStd.Actors/SquidStd.Actors.csproj" />
<Project Path="src/SquidStd.AspNetCore/SquidStd.AspNetCore.csproj" />
<Project Path="src/SquidStd.Caching.Abstractions/SquidStd.Caching.Abstractions.csproj" />
<Project Path="src/SquidStd.Caching.Redis/SquidStd.Caching.Redis.csproj" />
<Project Path="src/SquidStd.Caching/SquidStd.Caching.csproj" />
<Project Path="src/SquidStd.Core/SquidStd.Core.csproj" />
<Project Path="src/SquidStd.Database.Abstractions/SquidStd.Database.Abstractions.csproj" />
<Project Path="src/SquidStd.Database/SquidStd.Database.csproj" />
<Project Path="src/SquidStd.Messaging.Abstractions/SquidStd.Messaging.Abstractions.csproj" />
<Project Path="src/SquidStd.Messaging.RabbitMq/SquidStd.Messaging.RabbitMq.csproj" />
<Project Path="src/SquidStd.Messaging.Sqs/SquidStd.Messaging.Sqs.csproj" />
<Project Path="src/SquidStd.Messaging/SquidStd.Messaging.csproj" />
<Project Path="src/SquidStd.Network/SquidStd.Network.csproj" />
<Project Path="src/SquidStd.Persistence.Abstractions/SquidStd.Persistence.Abstractions.csproj" />
<Project Path="src/SquidStd.Persistence/SquidStd.Persistence.csproj" />
<Project Path="src/SquidStd.Persistence.MessagePack/SquidStd.Persistence.MessagePack.csproj" />
<Project Path="src/SquidStd.Plugin.Abstractions/SquidStd.Plugin.Abstractions.csproj" />
<Project Path="src/SquidStd.Scripting.Lua/SquidStd.Scripting.Lua.csproj" />
<Project Path="src/SquidStd.Services.Core/SquidStd.Services.Core.csproj" />
<Project Path="src/SquidStd.Storage.Abstractions/SquidStd.Storage.Abstractions.csproj" />
<Project Path="src/SquidStd.Storage.S3/SquidStd.Storage.S3.csproj" />
<Project Path="src/SquidStd.Storage/SquidStd.Storage.csproj" />
<Project Path="src/SquidStd.Templating/SquidStd.Templating.csproj" />
<Project Path="src/SquidStd.Workers.Abstractions/SquidStd.Workers.Abstractions.csproj" />
<Project Path="src/SquidStd.Workers/SquidStd.Workers.csproj" />
<Project Path="src/SquidStd.Workers.Manager/SquidStd.Workers.Manager.csproj" />
<Project Path="src/SquidStd.Templates/SquidStd.Templates.csproj" />
<Project Path="src/SquidStd.Search.Abstractions/SquidStd.Search.Abstractions.csproj" />
<Project Path="src/SquidStd.Search.Elasticsearch/SquidStd.Search.Elasticsearch.csproj" />
<Project Path="src/SquidStd.Mail.Abstractions/SquidStd.Mail.Abstractions.csproj" />
<Project Path="src/SquidStd.Mail.MailKit/SquidStd.Mail.MailKit.csproj" />
<Project Path="src/SquidStd.Mail.Queue/SquidStd.Mail.Queue.csproj" />
</Folder>
<Folder Name="/samples/">
<Project Path="samples/SquidStd.Samples.WorkerSystem/SquidStd.Samples.WorkerSystem.csproj"/>
<Project Path="samples/SquidStd.Samples.Templating/SquidStd.Samples.Templating.csproj"/>
<Project Path="samples/SquidStd.Samples.Storage/SquidStd.Samples.Storage.csproj"/>
<Project Path="samples/SquidStd.Samples.Search/SquidStd.Samples.Search.csproj"/>
<Project Path="samples/SquidStd.Samples.ScriptingLua/SquidStd.Samples.ScriptingLua.csproj"/>
<Project Path="samples/SquidStd.Samples.Plugins/SquidStd.Samples.Plugins.csproj"/>
<Project Path="samples/SquidStd.Samples.Networking/SquidStd.Samples.Networking.csproj"/>
<Project Path="samples/SquidStd.Samples.Persistence/SquidStd.Samples.Persistence.csproj"/>
<Project Path="samples/SquidStd.Samples.Email/SquidStd.Samples.Email.csproj"/>
<Project Path="samples/SquidStd.Samples.Database/SquidStd.Samples.Database.csproj"/>
<Project Path="samples/SquidStd.Samples.AspNetCore/SquidStd.Samples.AspNetCore.csproj"/>
<Project Path="samples/SquidStd.Samples.Messaging/SquidStd.Samples.Messaging.csproj"/>
<Project Path="samples/SquidStd.Samples.Caching/SquidStd.Samples.Caching.csproj"/>
<Project Path="samples/SquidStd.Samples.EventsJobsScheduling/SquidStd.Samples.EventsJobsScheduling.csproj"/>
<Project Path="samples/SquidStd.Samples.GettingStarted/SquidStd.Samples.GettingStarted.csproj"/>
<Project Path="samples/SquidStd.Samples.WorkerSystem/SquidStd.Samples.WorkerSystem.csproj" />
<Project Path="samples/SquidStd.Samples.Templating/SquidStd.Samples.Templating.csproj" />
<Project Path="samples/SquidStd.Samples.Storage/SquidStd.Samples.Storage.csproj" />
<Project Path="samples/SquidStd.Samples.Search/SquidStd.Samples.Search.csproj" />
<Project Path="samples/SquidStd.Samples.ScriptingLua/SquidStd.Samples.ScriptingLua.csproj" />
<Project Path="samples/SquidStd.Samples.Plugins/SquidStd.Samples.Plugins.csproj" />
<Project Path="samples/SquidStd.Samples.Networking/SquidStd.Samples.Networking.csproj" />
<Project Path="samples/SquidStd.Samples.Persistence/SquidStd.Samples.Persistence.csproj" />
<Project Path="samples/SquidStd.Samples.Commands/SquidStd.Samples.Commands.csproj" />
<Project Path="samples/SquidStd.Samples.Email/SquidStd.Samples.Email.csproj" />
<Project Path="samples/SquidStd.Samples.Database/SquidStd.Samples.Database.csproj" />
<Project Path="samples/SquidStd.Samples.AspNetCore/SquidStd.Samples.AspNetCore.csproj" />
<Project Path="samples/SquidStd.Samples.Messaging/SquidStd.Samples.Messaging.csproj" />
<Project Path="samples/SquidStd.Samples.Caching/SquidStd.Samples.Caching.csproj" />
<Project Path="samples/SquidStd.Samples.EventsJobsScheduling/SquidStd.Samples.EventsJobsScheduling.csproj" />
<Project Path="samples/SquidStd.Samples.GettingStarted/SquidStd.Samples.GettingStarted.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/SquidStd.Tests/SquidStd.Tests.csproj"/>
<Project Path="tests/SquidStd.Tests/SquidStd.Tests.csproj" />
</Folder>
</Solution>
5 changes: 5 additions & 0 deletions SquidStd.slnx.DotSettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/CSharpFileLayoutPatterns/Pattern/@EntryValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"&gt;&lt;TypePattern DisplayName="SquidStd"&gt;&lt;Entry DisplayName="Constants and static fields"&gt;&lt;Entry.Match&gt;&lt;Or&gt;&lt;Kind Is="constant"/&gt;&lt;And&gt;&lt;Kind Is="field"/&gt;&lt;Static/&gt;&lt;/And&gt;&lt;/Or&gt;&lt;/Entry.Match&gt;&lt;Entry.SortBy&gt;&lt;Readonly/&gt;&lt;/Entry.SortBy&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Instance fields"&gt;&lt;Entry.Match&gt;&lt;And&gt;&lt;Kind Is="field"/&gt;&lt;Not&gt;&lt;Static/&gt;&lt;/Not&gt;&lt;/And&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Properties and indexers"&gt;&lt;Entry.Match&gt;&lt;Or&gt;&lt;Kind Is="property"/&gt;&lt;Kind Is="indexer"/&gt;&lt;/Or&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Constructors"&gt;&lt;Entry.Match&gt;&lt;Kind Is="constructor"/&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Methods"&gt;&lt;Entry.Match&gt;&lt;And&gt;&lt;Kind Is="method"/&gt;&lt;Not&gt;&lt;Name Is="Dispose"/&gt;&lt;/Not&gt;&lt;/And&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Dispose last"&gt;&lt;Entry.Match&gt;&lt;And&gt;&lt;Kind Is="method"/&gt;&lt;Name Is="Dispose"/&gt;&lt;/And&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;Entry DisplayName="Nested types"&gt;&lt;Entry.Match&gt;&lt;Or&gt;&lt;Kind Is="class"/&gt;&lt;Kind Is="struct"/&gt;&lt;Kind Is="interface"/&gt;&lt;Kind Is="enum"/&gt;&lt;Kind Is="delegate"/&gt;&lt;/Or&gt;&lt;/Entry.Match&gt;&lt;/Entry&gt;&lt;/TypePattern&gt;&lt;/Patterns&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=SquidStd/@EntryIndexedValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Profile name="SquidStd"&gt;&lt;CSReformatCode&gt;True&lt;/CSReformatCode&gt;&lt;CSReorderTypeMembers&gt;True&lt;/CSReorderTypeMembers&gt;&lt;/Profile&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002EMemberReordering_002EMigrations_002ECSharpFileLayoutPatternRemoveIsAttributeUpgrade/@EntryIndexedValue">True</s:Boolean>
</wpf:ResourceDictionary>
83 changes: 83 additions & 0 deletions samples/SquidStd.Samples.Commands/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using DryIoc;
using SquidStd.Abstractions.Data.Internal.Commands;
using SquidStd.Abstractions.Extensions.Commands;
using SquidStd.Core.Interfaces.Commands;
using SquidStd.Services.Core.Extensions;

var container = new Container();
container.RegisterCommandDispatcher<Session>();
container.RegisterCommandHandler<PingCommand, Session, PingHandler>();
container.RegisterCommandHandler<EchoCommand, Session, EchoHandler>();
container.RegisterCommandHandler<EchoCommand, Session, AuditHandler>();

var dispatcher = container.Resolve<ICommandDispatcher<Session>>();

// At runtime SquidStdBootstrap starts CommandDispatcherActivator<Session>, which performs this
// auto-subscription. Done inline here to keep the sample self-contained.
foreach (var registration in container.Resolve<List<CommandHandlerRegistration<Session>>>())
{
registration.Subscribe(dispatcher, container);
}

// The context (here a Session) is passed explicitly at dispatch time — in a server this is the
// session the message arrived on. See RegisterSeededCommandDispatcher for building it from a seed.
var session = new Session();

await Dispatch(dispatcher, new PingCommand(), session);
await Dispatch(dispatcher, new EchoCommand("hello world"), session);

// Unknown command path: nothing registered for UnknownCommand.
var unknown = await dispatcher.DispatchAsync(new UnknownCommand(), session);
Console.WriteLine($"UnknownCommand -> matched={unknown.Matched} handlers={unknown.HandlerCount}");

return;

static async Task Dispatch<TCommand>(ICommandDispatcher<Session> dispatcher, TCommand command, Session context)
where TCommand : ICommand
{
var result = await dispatcher.DispatchAsync(command, context);
Console.WriteLine(
$"{typeof(TCommand).Name} -> matched={result.Matched} handlers={result.HandlerCount} errors={result.Errors.Count}"
);
}

internal sealed class Session
{
public string Id { get; } = Guid.NewGuid().ToString("N")[..8];
}

internal sealed record PingCommand : ICommand;

internal sealed record EchoCommand(string Text) : ICommand;

internal sealed record UnknownCommand : ICommand;

internal sealed class PingHandler : ICommandHandler<PingCommand, Session>
{
public Task HandleAsync(PingCommand command, Session context, CancellationToken cancellationToken = default)
{
Console.WriteLine($"[{context.Id}] pong");

return Task.CompletedTask;
}
}

internal sealed class EchoHandler : ICommandHandler<EchoCommand, Session>
{
public Task HandleAsync(EchoCommand command, Session context, CancellationToken cancellationToken = default)
{
Console.WriteLine($"[{context.Id}] echo: {command.Text}");

return Task.CompletedTask;
}
}

internal sealed class AuditHandler : ICommandHandler<EchoCommand, Session>
{
public Task HandleAsync(EchoCommand command, Session context, CancellationToken cancellationToken = default)
{
Console.WriteLine($"[{context.Id}] audit: echo len={command.Text.Length}");

return Task.CompletedTask;
}
}
17 changes: 17 additions & 0 deletions samples/SquidStd.Samples.Commands/SquidStd.Samples.Commands.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishNuget>false</PublishNuget>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\SquidStd.Core\SquidStd.Core.csproj"/>
<ProjectReference Include="..\..\src\SquidStd.Abstractions\SquidStd.Abstractions.csproj"/>
<ProjectReference Include="..\..\src\SquidStd.Services.Core\SquidStd.Services.Core.csproj"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,6 @@ namespace SquidStd.Abstractions.Attributes;
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public sealed class RegisterConfigSectionAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the attribute.
/// </summary>
/// <param name="sectionName">The configuration section name.</param>
public RegisterConfigSectionAttribute(string? sectionName = null)
{
SectionName = sectionName;
}

/// <summary>
/// Gets the configuration section name.
/// </summary>
Expand All @@ -24,4 +15,13 @@ public RegisterConfigSectionAttribute(string? sectionName = null)
/// Gets or sets the config loading priority.
/// </summary>
public int Priority { get; set; }

/// <summary>
/// Initializes a new instance of the attribute.
/// </summary>
/// <param name="sectionName">The configuration section name.</param>
public RegisterConfigSectionAttribute(string? sectionName = null)
{
SectionName = sectionName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,6 @@ namespace SquidStd.Abstractions.Attributes;
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public sealed class RegisterStdServiceAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the attribute.
/// </summary>
/// <param name="serviceType">The service contract registered for the annotated implementation.</param>
public RegisterStdServiceAttribute(Type? serviceType = null)
{
ServiceType = serviceType;
}

/// <summary>
/// Gets the service contract registered for the annotated implementation.
/// </summary>
Expand All @@ -24,4 +15,13 @@ public RegisterStdServiceAttribute(Type? serviceType = null)
/// Gets or sets the lifecycle start priority.
/// </summary>
public int Priority { get; set; }

/// <summary>
/// Initializes a new instance of the attribute.
/// </summary>
/// <param name="serviceType">The service contract registered for the annotated implementation.</param>
public RegisterStdServiceAttribute(Type? serviceType = null)
{
ServiceType = serviceType;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using DryIoc;
using SquidStd.Core.Interfaces.Commands;

namespace SquidStd.Abstractions.Data.Internal.Commands;

/// <summary>
/// A declarative command-handler registration consumed by the bootstrap activator. The
/// <see cref="Subscribe" /> closure captures the concrete command and handler types at registration
/// time, so subscription needs no reflection.
/// </summary>
/// <typeparam name="TContext">The dispatcher context type.</typeparam>
/// <param name="HandlerType">The concrete handler implementation type.</param>
/// <param name="Subscribe">Resolves the handler and subscribes it to the dispatcher.</param>
public sealed record CommandHandlerRegistration<TContext>(
Type HandlerType,
Action<ICommandDispatcher<TContext>, IResolverContext> Subscribe
);
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ public sealed class ConfigRegistrationData : IConfigEntry
{
private readonly Func<object> _createDefault;

public int Priority { get; }

public string SectionName { get; }

public Type ConfigType { get; }

public ConfigRegistrationData(
string sectionName,
Type configType,
Expand All @@ -23,12 +29,6 @@ public ConfigRegistrationData(
Priority = priority;
}

public int Priority { get; }

public string SectionName { get; }

public Type ConfigType { get; }

public object CreateDefault()
{
var config = _createDefault();
Expand Down
Loading
Loading