(feature): dependencies update, light refactoring

This commit is contained in:
Maksym Sadovnychyy 2026-06-20 17:02:06 +02:00
parent a005ca6cbe
commit 0efd79e567
9 changed files with 118 additions and 45 deletions

View File

@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.0.1] - 2026-06-20
### Added
- DI registration extensions in `MaksIT.HAMode.Extensions.ServiceCollectionExtensions` for runtime instance id and backend-specific lease service wiring (`PostgreSql`, `Redis`, `Etcd`).
### Changed
- Updated package/release setup to publish `MaksIT.HAMode` as the primary distributable library for version `1.0.1`.
- Updated several dependency versions across HAMode projects.
## [1.0.0] - 2026-06-20 ## [1.0.0] - 2026-06-20
### Added ### Added

View File

@ -7,6 +7,7 @@ Reusable high-availability runtime coordination library for MaksIT services.
## Packages ## Packages
- `MaksIT.HAMode` (single NuGet package) - `MaksIT.HAMode` (single NuGet package)
- `MaksIT.HAMode.Extensions.ServiceCollectionExtensions`
- `MaksIT.HAMode.Abstractions` namespace: - `MaksIT.HAMode.Abstractions` namespace:
- `IRuntimeInstanceId` - `IRuntimeInstanceId`
- `IRuntimeLeaseService` - `IRuntimeLeaseService`
@ -46,52 +47,50 @@ Reusable high-availability runtime coordination library for MaksIT services.
```xml ```xml
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.HAMode" Version="0.1.0" /> <PackageReference Include="MaksIT.HAMode" Version="1.0.1" />
</ItemGroup> </ItemGroup>
``` ```
### Shared runtime instance id ### Shared runtime instance id
```csharp ```csharp
using MaksIT.HAMode.Abstractions; using MaksIT.HAMode.Extensions;
builder.Services.AddSingleton<IRuntimeInstanceId, RuntimeInstanceIdProvider>(); builder.Services.AddHAModeRuntimeInstanceId();
``` ```
### PostgreSQL backend ### PostgreSQL backend
```csharp ```csharp
using MaksIT.HAMode.Abstractions; using MaksIT.HAMode.Abstractions;
using MaksIT.HAMode.PostgreSql; using MaksIT.HAMode.Extensions;
public sealed class MyPgLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseConnectionStringProvider { public sealed class MyPgLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseConnectionStringProvider {
public string ConnectionString => cfg["Configuration:Engine:ConnectionString"]!; public string ConnectionString => cfg["Configuration:Engine:ConnectionString"]!;
} }
builder.Services.AddSingleton<IRuntimeLeaseConnectionStringProvider, MyPgLeaseConnectionProvider>(); builder.Services.AddHAModePostgreSql<MyPgLeaseConnectionProvider>();
builder.Services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceNpgsql>();
``` ```
### Redis backend ### Redis backend
```csharp ```csharp
using MaksIT.HAMode.Abstractions; using MaksIT.HAMode.Abstractions;
using MaksIT.HAMode.Redis; using MaksIT.HAMode.Extensions;
public sealed class MyRedisLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseRedisConnectionProvider { public sealed class MyRedisLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseRedisConnectionProvider {
public string Configuration => cfg["Configuration:Redis:ConnectionString"]!; public string Configuration => cfg["Configuration:Redis:ConnectionString"]!;
public string KeyPrefix => "my-app/runtime-leases:"; public string KeyPrefix => "my-app/runtime-leases:";
} }
builder.Services.AddSingleton<IRuntimeLeaseRedisConnectionProvider, MyRedisLeaseConnectionProvider>(); builder.Services.AddHAModeRedis<MyRedisLeaseConnectionProvider>();
builder.Services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceRedis>();
``` ```
### etcd backend ### etcd backend
```csharp ```csharp
using MaksIT.HAMode.Abstractions; using MaksIT.HAMode.Abstractions;
using MaksIT.HAMode.Etcd; using MaksIT.HAMode.Extensions;
public sealed class MyEtcdLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseEtcdConnectionProvider { public sealed class MyEtcdLeaseConnectionProvider(IConfiguration cfg) : IRuntimeLeaseEtcdConnectionProvider {
public string Endpoints => cfg["Configuration:Etcd:Endpoints"]!; // ex: http://etcd:2379 public string Endpoints => cfg["Configuration:Etcd:Endpoints"]!; // ex: http://etcd:2379
@ -100,8 +99,7 @@ public sealed class MyEtcdLeaseConnectionProvider(IConfiguration cfg) : IRuntime
public string KeyPrefix => "my-app/runtime-leases/"; public string KeyPrefix => "my-app/runtime-leases/";
} }
builder.Services.AddSingleton<IRuntimeLeaseEtcdConnectionProvider, MyEtcdLeaseConnectionProvider>(); builder.Services.AddHAModeEtcd<MyEtcdLeaseConnectionProvider>();
builder.Services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceEtcd>();
``` ```
### Runtime acquire/release flow ### Runtime acquire/release flow
@ -147,7 +145,7 @@ In `MaksIT.Vault.Engine.csproj`:
```xml ```xml
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.HAMode" Version="0.1.0" /> <PackageReference Include="MaksIT.HAMode" Version="1.0.1" />
</ItemGroup> </ItemGroup>
``` ```
@ -209,7 +207,7 @@ In `MaksIT.CertsUI.Engine.csproj`:
```xml ```xml
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.HAMode" Version="0.1.0" /> <PackageReference Include="MaksIT.HAMode" Version="1.0.1" />
</ItemGroup> </ItemGroup>
``` ```

View File

@ -34,6 +34,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.Results" Version="2.0.2" /> <PackageReference Include="MaksIT.Results" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="11.0.0-preview.5.26302.115" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -34,9 +34,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="dotnet-etcd" Version="8.1.0" /> <PackageReference Include="dotnet-etcd" Version="8.1.0" />
<PackageReference Include="Google.Protobuf" Version="3.33.2" /> <PackageReference Include="Google.Protobuf" Version="3.35.1" />
<PackageReference Include="MaksIT.Results" Version="2.0.2" /> <PackageReference Include="MaksIT.Results" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="11.0.0-preview.5.26302.115" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -34,7 +34,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.Results" Version="2.0.2" /> <PackageReference Include="MaksIT.Results" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="11.0.0-preview.5.26302.115" />
<PackageReference Include="Npgsql" Version="10.0.3" /> <PackageReference Include="Npgsql" Version="10.0.3" />
</ItemGroup> </ItemGroup>

View File

@ -34,8 +34,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="MaksIT.Results" Version="2.0.2" /> <PackageReference Include="MaksIT.Results" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="11.0.0-preview.5.26302.115" />
<PackageReference Include="StackExchange.Redis" Version="2.8.58" /> <PackageReference Include="StackExchange.Redis" Version="3.0.47-preview" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -14,11 +14,11 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.6.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5"> <PackageReference Include="xunit.runner.visualstudio" Version="4.0.0-pre.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="xunit.v3" Version="3.2.2" /> <PackageReference Include="xunit.v3" Version="4.0.0-pre.128" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,80 @@
using MaksIT.HAMode.Abstractions;
using MaksIT.HAMode.Etcd;
using MaksIT.HAMode.PostgreSql;
using MaksIT.HAMode.Redis;
using Microsoft.Extensions.DependencyInjection;
namespace MaksIT.HAMode.Extensions;
/// <summary>
/// DI registration helpers for HAMode abstractions and backend implementations.
/// </summary>
public static class ServiceCollectionExtensions {
/// <summary>
/// Registers default runtime instance id provider as singleton.
/// </summary>
public static IServiceCollection AddHAModeRuntimeInstanceId(this IServiceCollection services) {
services.AddSingleton<IRuntimeInstanceId, RuntimeInstanceIdProvider>();
return services;
}
/// <summary>
/// Registers only PostgreSQL-backed runtime lease service.
/// </summary>
public static IServiceCollection AddHAModePostgreSqlLease<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseConnectionStringProvider {
services.AddSingleton<IRuntimeLeaseConnectionStringProvider, TConnectionProvider>();
services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceNpgsql>();
return services;
}
/// <summary>
/// Registers full PostgreSQL HA mode scenario.
/// </summary>
public static IServiceCollection AddHAModePostgreSql<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseConnectionStringProvider {
return services
.AddHAModeRuntimeInstanceId()
.AddHAModePostgreSqlLease<TConnectionProvider>();
}
/// <summary>
/// Registers only Redis-backed runtime lease service.
/// </summary>
public static IServiceCollection AddHAModeRedisLease<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseRedisConnectionProvider {
services.AddSingleton<IRuntimeLeaseRedisConnectionProvider, TConnectionProvider>();
services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceRedis>();
return services;
}
/// <summary>
/// Registers full Redis HA mode scenario.
/// </summary>
public static IServiceCollection AddHAModeRedis<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseRedisConnectionProvider {
return services
.AddHAModeRuntimeInstanceId()
.AddHAModeRedisLease<TConnectionProvider>();
}
/// <summary>
/// Registers only etcd-backed runtime lease service.
/// </summary>
public static IServiceCollection AddHAModeEtcdLease<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseEtcdConnectionProvider {
services.AddSingleton<IRuntimeLeaseEtcdConnectionProvider, TConnectionProvider>();
services.AddSingleton<IRuntimeLeaseService, RuntimeLeaseServiceEtcd>();
return services;
}
/// <summary>
/// Registers full etcd HA mode scenario.
/// </summary>
public static IServiceCollection AddHAModeEtcd<TConnectionProvider>(this IServiceCollection services)
where TConnectionProvider : class, IRuntimeLeaseEtcdConnectionProvider {
return services
.AddHAModeRuntimeInstanceId()
.AddHAModeEtcdLease<TConnectionProvider>();
}
}

View File

@ -6,10 +6,10 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<IncludeBuildOutput>false</IncludeBuildOutput> <IncludeBuildOutput>true</IncludeBuildOutput>
<PackageId>MaksIT.HAMode</PackageId> <PackageId>MaksIT.HAMode</PackageId>
<Version>1.0.0</Version> <Version>1.0.1</Version>
<Authors>Maksym Sadovnychyy</Authors> <Authors>Maksym Sadovnychyy</Authors>
<Company>MAKS-IT</Company> <Company>MAKS-IT</Company>
<Product>MaksIT.HAMode</Product> <Product>MaksIT.HAMode</Product>
@ -32,34 +32,19 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MaksIT.HAMode.Abstractions\MaksIT.HAMode.Abstractions.csproj" /> <ProjectReference Include="..\MaksIT.HAMode.Abstractions\MaksIT.HAMode.Abstractions.csproj" PrivateAssets="all" TreatAsPackageReference="false" />
<ProjectReference Include="..\MaksIT.HAMode.PostgreSql\MaksIT.HAMode.PostgreSql.csproj" /> <ProjectReference Include="..\MaksIT.HAMode.PostgreSql\MaksIT.HAMode.PostgreSql.csproj" PrivateAssets="all" TreatAsPackageReference="false" />
<ProjectReference Include="..\MaksIT.HAMode.Redis\MaksIT.HAMode.Redis.csproj" /> <ProjectReference Include="..\MaksIT.HAMode.Redis\MaksIT.HAMode.Redis.csproj" PrivateAssets="all" TreatAsPackageReference="false" />
<ProjectReference Include="..\MaksIT.HAMode.Etcd\MaksIT.HAMode.Etcd.csproj" /> <ProjectReference Include="..\MaksIT.HAMode.Etcd\MaksIT.HAMode.Etcd.csproj" PrivateAssets="all" TreatAsPackageReference="false" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="dotnet-etcd" Version="8.1.0" /> <PackageReference Include="dotnet-etcd" Version="8.1.0" />
<PackageReference Include="Google.Protobuf" Version="3.33.2" /> <PackageReference Include="Google.Protobuf" Version="3.35.1" />
<PackageReference Include="MaksIT.Results" Version="2.0.2" /> <PackageReference Include="MaksIT.Results" Version="2.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="11.0.0-preview.5.26302.115" />
<PackageReference Include="Npgsql" Version="10.0.3" /> <PackageReference Include="Npgsql" Version="10.0.3" />
<PackageReference Include="StackExchange.Redis" Version="2.8.58" /> <PackageReference Include="StackExchange.Redis" Version="3.0.47-preview" />
</ItemGroup>
<ItemGroup>
<None Include="..\MaksIT.HAMode.Abstractions\bin\$(Configuration)\$(TargetFramework)\MaksIT.HAMode.Abstractions.*"
Pack="true"
PackagePath="lib\$(TargetFramework)\" />
<None Include="..\MaksIT.HAMode.PostgreSql\bin\$(Configuration)\$(TargetFramework)\MaksIT.HAMode.PostgreSql.*"
Pack="true"
PackagePath="lib\$(TargetFramework)\" />
<None Include="..\MaksIT.HAMode.Redis\bin\$(Configuration)\$(TargetFramework)\MaksIT.HAMode.Redis.*"
Pack="true"
PackagePath="lib\$(TargetFramework)\" />
<None Include="..\MaksIT.HAMode.Etcd\bin\$(Configuration)\$(TargetFramework)\MaksIT.HAMode.Etcd.*"
Pack="true"
PackagePath="lib\$(TargetFramework)\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>