ktsu.Abstractions
1.0.3
Prefix Reserved
See the version list below for details.
dotnet add package ktsu.Abstractions --version 1.0.3
NuGet\Install-Package ktsu.Abstractions -Version 1.0.3
<PackageReference Include="ktsu.Abstractions" Version="1.0.3" />
<PackageVersion Include="ktsu.Abstractions" Version="1.0.3" />
<PackageReference Include="ktsu.Abstractions" />
paket add ktsu.Abstractions --version 1.0.3
#r "nuget: ktsu.Abstractions, 1.0.3"
#:package ktsu.Abstractions@1.0.3
#addin nuget:?package=ktsu.Abstractions&version=1.0.3
#tool nuget:?package=ktsu.Abstractions&version=1.0.3
status: draft title: ktsu.Abstractions description: A library providing a consistent set of interfaces for compression, encryption, hashing, obfuscation, serialization, and filesystem access. tags:
- abstractions
- .net
- csharp
- provider pattern
- dependency injection
- serialization
- compression
- encryption
- hashing
- obfuscation
ktsu.Abstractions
A small, focused library of interfaces that define a consistent API for common cross-cutting concerns:
- Compression:
ICompressionProvider
- Encryption:
IEncryptionProvider
- Hashing:
IHashProvider
- Obfuscation:
IObfuscationProvider
- Serialization:
ISerializationProvider
- Filesystem:
IFileSystemProvider
Designed for framework-agnostic usage and easy dependency injection.
Target frameworks
This package multi-targets common frameworks for broad compatibility:
- netstandard2.1
- net5.0, net6.0, net7.0, net8.0, net9.0
Supported OS: Windows, Linux, macOS.
Install
Via dotnet CLI:
dotnet add package ktsu.Abstractions
Via NuGet Package Manager:
Install-Package ktsu.Abstractions
Via PackageReference in csproj:
<ItemGroup>
<PackageReference Include="ktsu.Abstractions" Version="1.0.0" />
</ItemGroup>
Quickstart
Using the implementations from the ktsu.Common
package via DI:
using ktsu.Abstractions;
using ktsu.Common;
using Microsoft.Extensions.DependencyInjection;
IServiceCollection services = new ServiceCollection();
services.AddTransient<ICompressionProvider, ktsu.Common.GZipCompressionProvider>();
services.AddTransient<IEncryptionProvider, ktsu.Common.AesEncryptionProvider>();
services.AddTransient<IHashProvider, ktsu.Common.Sha256HashProvider>();
services.AddTransient<IObfuscationProvider, ktsu.Common.Base64ObfuscationProvider>();
services.AddTransient<ISerializationProvider, ktsu.Common.JsonSerializationProvider>();
services.AddTransient<IFileSystemProvider, ktsu.Common.FileSystemProvider>();
using IServiceProvider provider = services.BuildServiceProvider();
ICompressionProvider compressionProvider = provider.GetRequiredService<ICompressionProvider>();
IEncryptionProvider encryptionProvider = provider.GetRequiredService<IEncryptionProvider>();
IHashProvider hashProvider = provider.GetRequiredService<IHashProvider>();
Implementing your own providers
Implement the interfaces in your application or infrastructure layer and register them with your DI container.
For example, if you want to implement a custom MD5 hash provider, you can do the following:
using System.Security.Cryptography;
using ktsu.Abstractions;
public sealed class MyMD5HashProvider : IHashProvider
{
public int HashLengthBytes => 16; // MD5 produces 128-bit (16-byte) hashes
public (bool Success, int BytesWritten) TryHash(ReadOnlySpan<byte> data, Span<byte> destination)
{
if (destination.Length < HashLengthBytes)
{
return (false, HashLengthBytes);
}
using var md5 = MD5.Create();
byte[] hashBytes = md5.ComputeHash(data.ToArray());
hashBytes.CopyTo(destination);
return (true, HashLengthBytes);
}
// Note: Async methods and Hash() convenience method are inherited via default interface implementations.
}
using System.Text;
using ktsu.Abstractions;
using Microsoft.Extensions.DependencyInjection;
IServiceCollection services = new ServiceCollection();
services.AddTransient<IHashProvider, MyMD5HashProvider>();
using IServiceProvider provider = services.BuildServiceProvider();
IHashProvider hashProvider = provider.GetRequiredService<IHashProvider>();
// Using the convenience method (allocates)
byte[] inputData = Encoding.UTF8.GetBytes("Hello, World!");
byte[] hash = hashProvider.Hash(inputData);
// Using the zero-allocation Try method
Span<byte> hashBuffer = new byte[hashProvider.HashLengthBytes];
(bool success, int bytesWritten) = hashProvider.TryHash(inputData, hashBuffer);
if (success)
{
ReadOnlySpan<byte> computedHash = hashBuffer[..bytesWritten];
// Use computedHash...
}
Design principles
- Canonical APIs are allocation-free Try methods that write to caller-provided destinations and return
(Success, BytesWritten)
. - Convenience methods allocate a buffer based on the estimated size of the data, call Try*, retry if needed, and trim to
BytesWritten
.
Security notes
- Obfuscation in
IObfuscationProvider
is not cryptography. Use it only for non-security scenarios (e.g., casual hiding). For confidentiality and integrity, use strong, vetted cryptography viaIEncryptionProvider
implementations. - Implementations of
IEncryptionProvider
should rely on proven libraries (e.g., .NET BCL crypto, libsodium bindings) and follow best practices (AEAD modes, random IVs/nonces, key management).
Thread-safety and lifetime
- Provider implementations should be stateless or internally synchronized and safe to register as singletons in DI.
- If an implementation maintains internal mutable state, document the concurrency model and recommended lifetime.
Why use these abstractions?
- Consistency: A single, predictable surface across implementations
- Testability: Swap implementations and mock easily, especially for filesystem
- Separation of concerns: Keep app code free of vendor-specific details
Contributing
- Fork the repo and create a feature branch
- Implement or refine providers/analyzers and add tests
- Open a pull request
License
Licensed under the MIT License. See LICENSE.md for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
-
net5.0
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
-
net6.0
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
-
net7.0
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
-
net8.0
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
-
net9.0
- System.Memory (>= 4.6.3)
- Testably.Abstractions (>= 9.0.0)
NuGet packages (16)
Showing the top 5 NuGet packages that depend on ktsu.Abstractions:
Package | Downloads |
---|---|
ktsu.SerializationProviders.SystemTextJson
A collection of serialization providers implementing ktsu.Abstractions.ISerializationProvider for popular .NET JSON libraries including Newtonsoft.Json and System.Text.Json. |
|
ktsu.SerializationProviders.NewtonsoftJson
A collection of serialization providers implementing ktsu.Abstractions.ISerializationProvider for popular .NET JSON libraries including Newtonsoft.Json and System.Text.Json. |
|
ktsu.CompressionProviders.Gzip
A collection of serialization providers implementing ktsu.Abstractions.ISerializationProvider for popular .NET JSON libraries including Newtonsoft.Json and System.Text.Json. |
|
ktsu.HashProviders.MD5
A collection of serialization providers implementing ktsu.Abstractions.ISerializationProvider for popular .NET JSON libraries including Newtonsoft.Json and System.Text.Json. |
|
ktsu.HashProviders.SHA256
A collection of serialization providers implementing ktsu.Abstractions.ISerializationProvider for popular .NET JSON libraries including Newtonsoft.Json and System.Text.Json. |
GitHub repositories
This package is not used by any popular GitHub repositories.
## v1.0.3 (patch)
Changes since v1.0.2:
- Add System.Memory package reference and enhance interfaces in ktsu.Abstractions for better async support. Update README for clarity on usage and installation. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update README to reflect changes in target frameworks and provide an example implementation of a custom MD5 hash provider, enhancing clarity on usage and functionality. ([@matt-edmondson](https://github.com/matt-edmondson))
- Refactor interfaces in ktsu.Abstractions to use Try methods for compression, encryption, hashing, obfuscation, and serialization, enhancing performance by reducing allocations. Update README to reflect these changes and clarify usage. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.2 (patch)
Changes since v1.0.1:
- Remove EnumOrderingAnalyzer project and related files from the solution, streamlining the project structure and eliminating unused analyzers. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.1 (patch)
Changes since v1.0.0:
- Add detailed README for ktsu.Abstractions library, outlining interfaces for compression, encryption, hashing, obfuscation, serialization, and filesystem access. Include installation instructions, quickstart examples, and contributing guidelines. ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove obsolete abstraction models for compression, encryption, hashing, obfuscation, and filesystem types, along with global usings. This cleanup streamlines the project structure. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0 (major)
- Initial commit ([@matt-edmondson](https://github.com/matt-edmondson))
- Remove outdated files and update project references to reflect the new repository name 'Abstractions'. Set version to 1.0.0 and clean up changelog, README, and tags. ([@matt-edmondson](https://github.com/matt-edmondson))