Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 1 addition & 4 deletions example/SnowflakeId.AspNetCoreSample/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@
using System;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSnowflakeUniqueId(options =>
{
options.DataCenterId = 1;
});
builder.Services.AddSnowflakeUniqueId(builder.Configuration);

var app = builder.Build();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>disable</Nullable>
<ImplicitUsings>disable</ImplicitUsings>
</PropertyGroup>
Expand Down
5 changes: 5 additions & 0 deletions example/SnowflakeId.AspNetCoreSample/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,10 @@
"Microsoft.AspNetCore": "Warning"
}
},
"SnowflakeId": {
"DataCenterId": 1,
"UseConsoleLog": false,
"CustomEpoch": "2025-01-01T00:00:00Z"
},
"AllowedHosts": "*"
}
6 changes: 3 additions & 3 deletions example/SnowflakeId.Example/SnowflakeId.Example.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
21 changes: 21 additions & 0 deletions src/core/DependencyInjection/SnowflakeIdServiceExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.DependencyInjection;
using SnowflakeId.Core;
using Microsoft.Extensions.Configuration;

namespace SnowflakeId.DependencyInjection
{
Expand All @@ -27,5 +28,25 @@ public static IServiceCollection AddSnowflakeUniqueId(this IServiceCollection se
services.Configure(setupAction);
return services;
}


public static IServiceCollection AddSnowflakeUniqueId(this IServiceCollection services,
IConfiguration configuration)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddOptions();
var snowflakeIdSection = configuration.GetSection("SnowflakeId");
if (!snowflakeIdSection.Exists())
{
throw new ArgumentException("The SnowflakeId section is not found in the configuration.");
}
services.Configure<SnowflakOptions>(snowflakeIdSection);
services.TryAddScoped<ISnowflakeService, SnowflakeIdService>();
return services;
}

}
}
7 changes: 5 additions & 2 deletions src/core/SnowflakeId.Core.csproj
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>disable</Nullable>
<PackageId>Hussien.SnowflakeId</PackageId>
<Title>Hussien.SnowflakeId</Title>
<Authors>Mohammed Ahmed Hussien</Authors>
<PackageProjectUrl>https://github.com/Shoogn/SnowflakeId</PackageProjectUrl>
<RepositoryUrl>https://github.com/Shoogn/SnowflakeId</RepositoryUrl>
<Version>3.2.0</Version>
<Version>3.3.0</Version>
<RepositoryType>git</RepositoryType>
<PackageTags>SnowflakeId, UniqueSnowflakeId, UniqueId, Primary Keys</PackageTags>
<NeutralLanguage>en-SD</NeutralLanguage>
Expand All @@ -23,20 +23,23 @@
<Net7Version>7.0.0</Net7Version>
<Net8Version>8.0.0</Net8Version>
<Net9Version>9.0.0</Net9Version>
<Net10Version>10.0.0</Net10Version>
</PropertyGroup>

<PropertyGroup>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net6.0'">$(Net6Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net7.0'">$(Net7Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net8.0'">$(Net8Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net9.0'">$(Net9Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net10.0'">$(Net10Version)</ExtensionsVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Options" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(ExtensionsVersion)" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="SnowflakeId.Tests" />
Expand Down
8 changes: 6 additions & 2 deletions tests/SnowflakeId.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>

<IsPackable>false</IsPackable>
Expand All @@ -13,20 +13,21 @@
<Net7Version>7.0.0</Net7Version>
<Net8Version>8.0.0</Net8Version>
<Net9Version>9.0.0</Net9Version>
<Net10Version>10.0.0</Net10Version>
</PropertyGroup>

<PropertyGroup>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net6.0'">$(Net6Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net7.0'">$(Net7Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net8.0'">$(Net8Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net9.0'">$(Net9Version)</ExtensionsVersion>
<ExtensionsVersion Condition="'$(TargetFramework)' == 'net10.0'">$(Net10Version)</ExtensionsVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
</ItemGroup>
Expand All @@ -37,6 +38,9 @@
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Options" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="$(ExtensionsVersion)" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(ExtensionsVersion)" />
</ItemGroup>

<ItemGroup>
Expand Down
44 changes: 41 additions & 3 deletions tests/SnowflakeIdServiceExtensionsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
*/

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Moq;
Expand All @@ -17,7 +18,7 @@ namespace SnowflakeId.Tests
public class SnowflakeIdServiceExtensionsTest
{
[Fact]
public void Can_Add_SnowflakId_To_Service_Collection_Without_SnowflakeId_Option()
public void AddSnowflakId_Without_SnowflakeIdOption_And_RegistersService()
{
var services = new ServiceCollection();
services.AddLogging();
Expand All @@ -35,7 +36,7 @@ public void Can_Add_SnowflakId_To_Service_Collection_Without_SnowflakeId_Option(
}

[Fact]
public void Can_Add_SnowflakeId_To_Service_Collections_With_SnowflakOptions()
public void AddSnowflakId_With_SnowflakeIdOption_And_RegistersService()
{
var services = new ServiceCollection();
services.AddLogging();
Expand All @@ -51,7 +52,44 @@ public void Can_Add_SnowflakeId_To_Service_Collections_With_SnowflakOptions()
}

[Fact]
public void Can_Replace_SnowflakeId_Default_Registration_By_Creating_Object_That_Implement_ISnowflakeService()
public void AddSnowflakId_And_Binding_Configuration_And_RegistersService()
{
var inMemorySettings = new Dictionary<string, string>
{
{"SnowflakeId:DataCenterId", "3"},
{"SnowflakeId:UseConsoleLog", "true"},
{"SnowflakeId:CustomEpoch", "2025-01-01T00:00:00Z"},
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();
var services = new ServiceCollection();
services.AddLogging();
services.AddSnowflakeUniqueId(configuration);
var serviceProvider = services.BuildServiceProvider();
var snowflakeService = serviceProvider.GetRequiredService<ISnowflakeService>();
var snowflakeIdOptionGetter = serviceProvider.GetRequiredService<IOptions<SnowflakOptions>>();
var snowflakeIdOption = snowflakeIdOptionGetter.Value;
Assert.NotNull(snowflakeService);
Assert.Equal(3, snowflakeIdOption.DataCenterId);
Assert.True(snowflakeIdOption.UseConsoleLog);
Assert.Equal(DateTime.Parse("2025-01-01T00:00:00Z").ToUniversalTime(), snowflakeIdOption.CustomEpoch?.ToUniversalTime());

}

[Fact]
public void AddSnowflakId_Throe_When_Missing_Binding_Configuration()
{
// empty config intentionally
IConfiguration config = new ConfigurationBuilder().Build();
var services = new ServiceCollection();

var ex = Assert.Throws<ArgumentException>(() => services.AddSnowflakeUniqueId(config));
Assert.Contains("SnowflakeId", ex.Message, StringComparison.OrdinalIgnoreCase);
}

[Fact]
public void Replace_SnowflakeId_Default_Registration_By_Creating_Object_That_Implement_ISnowflakeService()
{
var services = new ServiceCollection();
services.AddLogging();
Expand Down