Plinth.Common
1.8.1
Prefix Reserved
dotnet add package Plinth.Common --version 1.8.1
NuGet\Install-Package Plinth.Common -Version 1.8.1
<PackageReference Include="Plinth.Common" Version="1.8.1" />
<PackageVersion Include="Plinth.Common" Version="1.8.1" />
<PackageReference Include="Plinth.Common" />
paket add Plinth.Common --version 1.8.1
#r "nuget: Plinth.Common, 1.8.1"
#:package Plinth.Common@1.8.1
#addin nuget:?package=Plinth.Common&version=1.8.1
#tool nuget:?package=Plinth.Common&version=1.8.1
README
Plinth.Common
A set of generic utilities, extensions, and enhancements for dotnet applications
Cache
Extensions for atomic GetOrCreate on Microsoft.Extensions.Caching.Memory memory caches Example:
IMemoryCache memCache = MemoryCacheUtil.Create();
await memCache.GetOrCreateAtomicMaxDurationAsync(
"key", TimeSpan.FromMinutes(2), async () => await LoadValue());
👉 MemoryCacheUtil.Create() is a shorthand method for creating a new IMemoryCache.
Collections
- Case Insensitive Dictionary and HashSet
- Default Dictionary that will supply a default value for a key when requested
- Examples:
// values are case insensitive
var set = new CaseInsensitiveHashSet<string>() { "abc", "ABC" };
set.Contains("aBc"); // true
// LINQ extension
var set = items.Where(...).Select(...).ToCaseInsensitiveHashSet();
// keys are case insensitive
var dict = new CaseInsensitiveDictionary<string, int>() { ["abc"] = 5 };
dict["ABC"]; // 5
dict.ContainsKey("aBc"); // true
// LINQ extension
var dict = items.Where(...).Select(...).ToCaseInsensitiveDictionary(v => v.ID);
// default dictionary, easy counting
var dict = new DefaultDictionary<string, int>(0);
dict["a"]++; // dict["a"] now is 1
// default dictionary, easy multi maps
var dict = new DefaultDictionary<string, ISet<int>>(() => new HashSet<int>());
dict["a"].Add(7); // "a" has a set with (7) in it
Constants
Handy constants for Content Types
ContentTypes.ApplicationJson ⇒ "application/json; charset=utf-8"
Exceptions
Logical exceptions for common API return values. Allows for separation between logic and api projects
- LogicalBadRequestException
- LogicalConflictException
- LogicalForbiddenException
- LogicalNotFoundException
- LogicalPreconditionFailedException
Extensions
A variety of useful extensions to common classes
- For manipulating DataRow
- IDictionary
.GetValueOrDefault() - IEnumerable
.IsNullOrEmpty()and.Many() - Enum extensions for converting between enums by name (not by integer value)
- ILogger extensions for logging code durations
using (log.LogExecTiming("some code"))
{
... some code ...
log.Debug("action");
}
// logs
[CTX-6540F] : Starting some code #52400089
[CTX-6540F] : action
[CTX-6540F] : some code #52400089 Took: 00.00.00.274472
- Sensitive data extensions for masking secure items like passwords, SSNs, and credit card numbers.
- Stream extensions
.ToBytes()and.ToBytesAsync() - String extensions for converting strings to various types,
.ChangeType<T>()as various.To{Type}OrNull()
Logging
- Extensions and enhancements to Microsoft.Extensions.ILogger for better tracing when using the Plinth ecosystem
- Provides
StaticLogManager.GetLogger()to retrieve a static logger for the current class - Provides
RequestTraceIdandRequestTracePropertiessingletons for passing data through the entire call stack (including across HTTP boundaries) - Adds shorthand calls for shorter log function names.
LogTrace⇒TraceLogDebug⇒DebugLogInformation⇒InfoLogWarning⇒WarnLogError⇒ErrorLogCritical⇒CriticalorFatal
Mapping
An enhanced version of Omu.ValueInjecter for easy object to object mapping Allows for deeply nested Field to Field mapping (including Lists, Sets, and Dictionaries)
Utils
A set of static utilities
- AsyncUtil: Some async utilities, mostly obsolete as of net6.0
- DateTimeUtil: Utilities for truncating date times, UTC/TZ conversions, and some date comparison functions
- HexUtil: Conversion of hex strings to bytes and vice versa. 👉 Obsolete as of .NET 9.0 or greater - Use
Convert.ToHexStringLower()andConvert.FromHexString()instead. HexUtil methods still function on .NET 8.0 and earlier. - RuntimeUtil: Provides
FindExecutableHome()which can find your project root at runtime - TimeUtil: Provides log timing (used by ILogger extension noted above)
- UriUtil: Provides a
Join()method similar to Path.Combine()
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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 is compatible. 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. |
-
net10.0
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- ValueInjecter (>= 3.2.0)
-
net8.0
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
- ValueInjecter (>= 3.2.0)
-
net9.0
- Microsoft.Extensions.Caching.Memory (>= 10.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
- ValueInjecter (>= 3.2.0)
NuGet packages (18)
Showing the top 5 NuGet packages that depend on Plinth.Common:
| Package | Downloads |
|---|---|
|
Plinth.Serialization
JSON/XML/etc object serialization |
|
|
Plinth.Security
Security, Cryptography, and Token Utilities |
|
|
Plinth.HttpApiClient.Common
Shared objects for HTTP Api Client frameworks |
|
|
Plinth.HttpApiClient
HTTP Api Client framework built on MS HttpClient |
|
|
Plinth.AspNetCore
Plinth ASP.NET Core Services Utilities |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 1.8.1 | 64 | 12/11/2025 | |
| 1.8.0 | 719 | 11/13/2025 | |
| 1.8.0-b211.72089fd9 | 240 | 11/12/2025 | |
| 1.7.4 | 3,707 | 8/6/2025 | |
| 1.7.3 | 586 | 8/2/2025 | |
| 1.7.2 | 5,455 | 3/16/2025 | |
| 1.7.1 | 1,762 | 12/12/2024 | |
| 1.7.0 | 5,376 | 11/12/2024 | |
| 1.6.6 | 1,588 | 11/8/2024 | |
| 1.6.5 | 5,133 | 8/31/2024 | |
| 1.6.4 | 1,152 | 8/2/2024 | |
| 1.6.3 | 12,186 | 5/15/2024 | |
| 1.6.2 | 1,943 | 2/16/2024 | |
| 1.6.1 | 9,368 | 1/5/2024 | |
| 1.6.0 | 1,943 | 11/30/2023 | |
| 1.5.10-b186.aca976b4 | 133 | 11/30/2023 | |
| 1.5.9 | 5,347 | 11/29/2023 | |
| 1.5.9-b174.64153841 | 574 | 11/23/2023 | |
| 1.5.9-b172.dfc6e7bd | 148 | 11/17/2023 | |
| 1.5.9-b171.4e2b92e2 | 217 | 11/4/2023 | |
| 1.5.8 | 17,685 | 10/23/2023 | |
| 1.5.7 | 10,664 | 7/31/2023 | |
| 1.5.6 | 15,544 | 7/13/2023 | |
| 1.5.5 | 1,278 | 6/29/2023 | |
| 1.5.4 | 2,995 | 3/7/2023 | |
| 1.5.3 | 2,162 | 3/3/2023 | |
| 1.5.2 | 3,136 | 1/11/2023 | |
| 1.5.2-b92.7c961f5f | 259 | 1/11/2023 | |
| 1.5.0 | 3,423 | 11/9/2022 | |
| 1.5.0-b88.7a7c20cd | 243 | 11/9/2022 | |
| 1.4.7 | 19,095 | 10/20/2022 | |
| 1.4.6 | 6,733 | 10/17/2022 | |
| 1.4.5 | 7,088 | 10/1/2022 | |
| 1.4.4 | 12,264 | 8/16/2022 | |
| 1.4.3 | 7,434 | 8/2/2022 | |
| 1.4.2 | 7,251 | 7/19/2022 | |
| 1.4.2-b80.7fdbfd04 | 292 | 7/19/2022 | |
| 1.4.2-b74.acaf86f5 | 339 | 6/15/2022 | |
| 1.4.1 | 7,450 | 6/13/2022 | |
| 1.4.0 | 7,227 | 6/6/2022 | |
| 1.3.8 | 9,388 | 4/12/2022 | |
| 1.3.7 | 7,309 | 3/21/2022 | |
| 1.3.6 | 7,279 | 3/17/2022 | |
| 1.3.6-b67.ca5053f3 | 324 | 3/16/2022 | |
| 1.3.6-b66.4a9683e6 | 296 | 3/16/2022 | |
| 1.3.5 | 7,115 | 2/23/2022 | |
| 1.3.4 | 7,654 | 1/20/2022 | |
| 1.3.3 | 4,302 | 12/29/2021 | |
| 1.3.2 | 3,816 | 12/11/2021 | |
| 1.3.1 | 3,975 | 11/12/2021 | |
| 1.3.0 | 4,060 | 11/8/2021 | |
| 1.2.3 | 5,409 | 9/22/2021 | |
| 1.2.2 | 4,523 | 8/20/2021 | |
| 1.2.1 | 4,889 | 8/5/2021 | |
| 1.2.0 | 13,863 | 8/1/2021 | |
| 1.2.0-b37.a54030b9 | 335 | 6/24/2021 | |
| 1.1.6 | 12,295 | 3/22/2021 | |
| 1.1.5 | 4,515 | 3/9/2021 | |
| 1.1.4 | 5,493 | 2/27/2021 | |
| 1.1.3 | 4,029 | 2/17/2021 | |
| 1.1.2 | 4,002 | 2/12/2021 | |
| 1.1.1 | 4,275 | 2/1/2021 | |
| 1.1.0 | 3,998 | 12/16/2020 | |
| 1.1.0-b27.b66c309b | 486 | 11/15/2020 | |
| 1.0.12 | 6,874 | 10/18/2020 | |
| 1.0.11 | 4,166 | 10/6/2020 | |
| 1.0.10 | 4,242 | 9/30/2020 | |
| 1.0.9 | 4,048 | 9/29/2020 | |
| 1.0.8 | 4,102 | 9/26/2020 | |
| 1.0.7 | 4,042 | 9/19/2020 | |
| 1.0.6 | 4,015 | 9/3/2020 | |
| 1.0.5 | 4,149 | 9/2/2020 | |
| 1.0.4 | 4,275 | 9/1/2020 | |
| 1.0.3 | 3,923 | 9/1/2020 | |
| 1.0.2 | 3,938 | 8/29/2020 | |
| 1.0.1 | 3,920 | 8/29/2020 | |
| 1.0.0 | 3,987 | 8/29/2020 | |
| 1.0.0-b1.c22f563d | 434 | 8/28/2020 |
net10.0 support