From f30518ac0e4723decc3f82639a0e026dfe80d442 Mon Sep 17 00:00:00 2001 From: Khashayar Nourian Date: Tue, 24 Jan 2023 06:05:50 +0330 Subject: [PATCH] Develop (#3) * fix build problem * - Use static class instead of singleton pattern - Add SetSeed Method - Remove extra dependencies * Update Test * Updated Readme Adding Comments --- README.md | 26 ++++--- SequentialGuid/GuidInstance.cs | 69 +++++++++++++++++++ SequentialGuid/ISequentialGuid.cs | 10 --- SequentialGuid/SequentialGuid.cs | 44 ------------ SequentialGuid/SequentialGuid.csproj | 6 +- SequentialGuid/ServiceProvider.cs | 13 ---- .../SequentialGuidTests.csproj | 31 ++++----- SequentialGuidTests/UnitTest.cs | 34 ++++----- SequentialGuidTests/Usings.cs | 1 - 9 files changed, 121 insertions(+), 113 deletions(-) create mode 100644 SequentialGuid/GuidInstance.cs delete mode 100644 SequentialGuid/ISequentialGuid.cs delete mode 100644 SequentialGuid/SequentialGuid.cs delete mode 100644 SequentialGuid/ServiceProvider.cs diff --git a/README.md b/README.md index 96de4bf..1dadbcf 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,36 @@ NuGet Package to generate SQL Server Friendly Sequential Guid ## Usage -Add as Dependency to service collection: -This will register this Package as Singelton +1. Get Next Guid ```csharp using SequentialGuid; - services.AddSequentialGuid(); + public void ExampleMethod() + { + var guid = GuidInstance.Next(); + } ``` -Add With Dependency Injection to where its needed: +2. Get Current Guid ```csharp using SequentialGuid; - private readonly ISequentialGuid _sequentialGuid; - public class Example(ISequentialGuid sequentialGuid) + + public void ExampleMethod() { - _sequentialGuid = sequentialGuid; + var guid = GuidInstance.GetCurrentGuid(); } +``` + + +3. Seed First Guid + +```csharp + using SequentialGuid; + public void ExampleMethod() { - var guid = _sequentialGuid.Next(); + var guid = GuidInstance.SetSeed(Guid.NewGuid()); } ``` diff --git a/SequentialGuid/GuidInstance.cs b/SequentialGuid/GuidInstance.cs new file mode 100644 index 0000000..d6ce4d5 --- /dev/null +++ b/SequentialGuid/GuidInstance.cs @@ -0,0 +1,69 @@ +using System; + +namespace SequentialGuid +{ + /// + /// Generate Guids in Sequential order + /// First Guid will be 00000000-0000-0000-0000-000000000001 + /// Use Set Seed to Seed First Guid + /// Prefered Way to do : + /// + /// SetSeed(Guid.NewGuid()); + /// + /// + public static class GuidInstance + { + private static int[]? _sqlOrderMap; + private static int[] SqlOrderMap + { + get + { + _sqlOrderMap ??= new int[16] { + 3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10 + }; + return _sqlOrderMap; + } + } + + private static Guid _currentGuid; + static GuidInstance() + { + _currentGuid = new Guid("00000000-0000-0000-0000-000000000001"); + } + /// + /// Set Starting Point for Guid Generation + /// + /// + public static void SetSeed(Guid guid) + { + _currentGuid = new Guid(guid.ToByteArray()); + } + /// + /// Returns Current Guid (Last Generated) + /// + /// Current Guid + public static Guid GetCurrentGuid() + { + return _currentGuid; + } + /// + /// Generate Next Guid + /// + /// Next Guid + public static Guid Next() + { + byte[] bytes = _currentGuid.ToByteArray(); + for (int mapIndex = 0; mapIndex < 16; mapIndex++) + { + int bytesIndex = SqlOrderMap[mapIndex]; + bytes[bytesIndex]++; + if (bytes[bytesIndex] != 0) + { + break; // No need to increment more significant bytes + } + } + _currentGuid = new Guid(bytes); + return _currentGuid; + } + } +} diff --git a/SequentialGuid/ISequentialGuid.cs b/SequentialGuid/ISequentialGuid.cs deleted file mode 100644 index 7a248e2..0000000 --- a/SequentialGuid/ISequentialGuid.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace SequentialGuid -{ - public interface ISequentialGuid - { - Guid GetCurrentGuid(); - Guid Next(); - } -} diff --git a/SequentialGuid/SequentialGuid.cs b/SequentialGuid/SequentialGuid.cs deleted file mode 100644 index c4fc1a1..0000000 --- a/SequentialGuid/SequentialGuid.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; - -namespace SequentialGuid -{ - public class SequentialGuid : ISequentialGuid - { - private static int[]? _sqlOrderMap; - private static int[] SqlOrderMap - { - get - { - _sqlOrderMap ??= new int[16] { - 3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10 - }; - return _sqlOrderMap; - } - } - - private Guid _currentGuid; - public SequentialGuid() - { - _currentGuid = Guid.NewGuid(); - } - public Guid GetCurrentGuid() - { - return _currentGuid; - } - public Guid Next() - { - byte[] bytes = _currentGuid.ToByteArray(); - for (int mapIndex = 0; mapIndex < 16; mapIndex++) - { - int bytesIndex = SqlOrderMap[mapIndex]; - bytes[bytesIndex]++; - if (bytes[bytesIndex] != 0) - { - break; // No need to increment more significant bytes - } - } - _currentGuid = new Guid(bytes); - return _currentGuid; - } - } -} diff --git a/SequentialGuid/SequentialGuid.csproj b/SequentialGuid/SequentialGuid.csproj index 76f86d7..a042c27 100644 --- a/SequentialGuid/SequentialGuid.csproj +++ b/SequentialGuid/SequentialGuid.csproj @@ -13,7 +13,7 @@ True https://github.com/knourian/Sequential-Guid Knourian.$(AssemblyName) - 1.0.1 + 2.0.0 @@ -23,8 +23,4 @@ - - - - diff --git a/SequentialGuid/ServiceProvider.cs b/SequentialGuid/ServiceProvider.cs deleted file mode 100644 index 29259c0..0000000 --- a/SequentialGuid/ServiceProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace SequentialGuid -{ - public static class ServiceProvider - { - public static IServiceCollection AddSequentialGuid(this IServiceCollection services) - { - services.AddSingleton(); - return services; - } - } -} \ No newline at end of file diff --git a/SequentialGuidTests/SequentialGuidTests.csproj b/SequentialGuidTests/SequentialGuidTests.csproj index 71515c7..86d4ac2 100644 --- a/SequentialGuidTests/SequentialGuidTests.csproj +++ b/SequentialGuidTests/SequentialGuidTests.csproj @@ -1,23 +1,22 @@ - - net6.0 - enable - enable + + net6.0 + enable + enable - false - + false + - - - - - - - + + + + + + - - - + + + diff --git a/SequentialGuidTests/UnitTest.cs b/SequentialGuidTests/UnitTest.cs index ca72989..129a6e8 100644 --- a/SequentialGuidTests/UnitTest.cs +++ b/SequentialGuidTests/UnitTest.cs @@ -1,40 +1,42 @@ using SequentialGuid; - namespace SequentialGuidTests { [TestClass] public class UnitTest { - private readonly ISequentialGuid _sequenctialGuid; public UnitTest() { - var services = new ServiceCollection(); - services.AddSequentialGuid(); - var serviceProvider = services.BuildServiceProvider(); - _sequenctialGuid = serviceProvider.GetService()!; - } - [TestMethod] - public void Sequential_Guid_Should_Not_Be_Null() - { - Assert.IsNotNull(_sequenctialGuid); } + [TestMethod] public void Cureent_Guid_Should_Not_Be_Null() { - Assert.IsNotNull(_sequenctialGuid.GetCurrentGuid()); + Assert.IsNotNull(GuidInstance.GetCurrentGuid()); } [TestMethod] public void Next_Guid_Should_Not_Be_Null() { - Assert.IsNotNull(_sequenctialGuid.Next()); + Assert.IsNotNull(GuidInstance.Next()); } [TestMethod] public void Next_Guid_Should_Be_Greater() { - var current = _sequenctialGuid.GetCurrentGuid(); - var next = _sequenctialGuid.Next(); + var current = GuidInstance.GetCurrentGuid(); + var next = GuidInstance.Next(); Assert.IsTrue(next.CompareTo(current) > 0); } + + [TestMethod] + public void Check_Seed_Method() + { + Guid current = GuidInstance.GetCurrentGuid(); + Guid next = Guid.NewGuid(); + GuidInstance.SetSeed(next); + Guid NewCurrnet = GuidInstance.GetCurrentGuid(); + Assert.IsNotNull(NewCurrnet); + Assert.IsTrue(next.CompareTo(NewCurrnet) == 0); + Assert.IsTrue(current.CompareTo(NewCurrnet) != 0); + } } -} \ No newline at end of file +} diff --git a/SequentialGuidTests/Usings.cs b/SequentialGuidTests/Usings.cs index 216bd33..540383d 100644 --- a/SequentialGuidTests/Usings.cs +++ b/SequentialGuidTests/Usings.cs @@ -1,2 +1 @@ -global using Microsoft.Extensions.DependencyInjection; global using Microsoft.VisualStudio.TestTools.UnitTesting;