SonghayCore 8.0.2
dotnet add package SonghayCore --version 8.0.2
NuGet\Install-Package SonghayCore -Version 8.0.2
<PackageReference Include="SonghayCore" Version="8.0.2" />
<PackageVersion Include="SonghayCore" Version="8.0.2" />
<PackageReference Include="SonghayCore" />
paket add SonghayCore --version 8.0.2
#r "nuget: SonghayCore, 8.0.2"
#addin nuget:?package=SonghayCore&version=8.0.2
#tool nuget:?package=SonghayCore&version=8.0.2
SonghayCore
Here is the Core code to install as a NuGet package for all of my studio Solutions. Anyone who may be reading this 👀 is free to do the same. This package is based on net8.0
.
NuGet package 📦: SonghayCore
documentation 📚: SonghayCore
API
core reusable, opinionated concerns
Songhay.Hosting
One of the most important additions to .NET came in .NET 6.0 (circa 2021): the .NET Generic Host [📖 docs]. This host concept from Microsoft allows developers to not have to reinvent:
- Dependency injection (DI)
- Logging
- Configuration
- App shutdown
IHostedService
implementations (for long-running background tasks [📖 docs ])
All ASP.NET developers expect to get these things “for free” and, finally, Microsoft is basically letting all .NET developers get these things for free. This Core recognizes the .NET Generic Host, stating with the DefaultHostedService
class (see Songhay.Extensions
below for more details).
Songhay.Diagnostics
This Core is concerned with tracing as well as logging. Logging concerns should be logically above this Core. TraceSources
and TraceSourceExtensions
define how tracing should be implemented with a bias toward using all source levels. When tracing is not configured for this Core then it will be ignored without throwing exceptions.
For a review of the organizational difference between tracing and logging, see “Tracing vs Logging vs Monitoring: What’s the Difference?” by Chrissy Kidd.
Documentation 📚: Songhay.Diagnostics
Songhay.Extensions
The Songhay System uses imperative C# code with a view to make it more functional in an effort to control complexity and enhance maintainability.
The preference for extension methods encourages stateless, reusable routines (many of them are “pure” functions).
Notable extensions:
IConfigurationExtensions
— defines shared routines based on conventions around the .NET Generic Host [📖 docs].IConfigurationBuilderExtensions
— defines shared routines for application configuration building under .NET Standard.ILoggerExtensions
— defines shared routines based on conventions around the .NET Generic Host [📖 docs].HttpRequestMessageExtensions
— defines shared routines for HTTP access under .NET Standard with a lazy-loadedHttpClient
. Routines for Azure Blob Storage are included here.HttpWebRequestExtensions
— defines shared routines for HTTP access for the legacy .NET Framework.
There is support for URI templates (to be used with RestApiMetadata
) in the form of extension methods, running on top of Tavis.UriTemplates
.
Documentation 📚: Songhay.Extensions
Songhay.Models
The Core models of the Songhay System define types for MIME, XHTML, OPML, REST, the Repository, the Display Item (for WPF and other MVVM solutions), etc.
The Core models are “anemic” by design (there are very few abstract classes)—any logic would be found first in an Extension Method.
Notable models:
DisplayItemModel
— defines the conventional way to display data.MenuDisplayItemModel
— defines the conventional way to display nested/grouped data.RestApiMetadata
— defines conventional REST API metadata.
Documentation 📚: Songhay.Models
Songhay.Xml
The “core” of the Core is concern for XML. The Songhay System started out as utilities around XPathDocument
and grew into LINQ for XML—over XDocument
.
Documentation 📚: Songhay.Xml
fundamental boundary-crossing abstractions
This Core features the ‘boundary-crossing abstractions’ (and default implementations) needed for the enterprise work based on my historical needs:
IApiEndpoint
— defines the conventional way to access distributed data (default implementation:ApiEndpoint
).IApiRequestStrategy
— defines the conventional way to request data from an endpoint (default implementations:ApiRequestStrategy
andAzureBlobApiRequestStrategy
).IBlobStreamApiEndpoint
— defines the conventional way to request BLOB data from an endpoint (default implementation:BlobStreamApiEndpoint
).
Dependency-injecting these ‘boundary-crossing abstractions’ are far more mockable than, say, using HttpRequestMessage
directly.
the core Activity concept
This Core features the concept of the Activity which is a way to formally recognize that all line of business applications can be thought of as a ‘tree’ of inputs and outputs. It follows that each ‘node’ of this ‘tree’ can be called an Activity. The following abstractions classify the Activities needed so far:
IActivity
— defines the conventional, synchronous, input-output ActivitiesIActivityOutputOnly
— defines the conventional, synchronous Activities with output only (input usually comes fromIConfiguration
in this case)IActivityOutputOnlyTask
— defines the conventional, asynchronous Activities with output only (input usually comes fromIConfiguration
in this case)IActivityTask
— defines the conventional, asynchronous, input-output Activities
This Activity concept which I regard as fundamental is the least likely architectural reality that would be shared by my peers 😐 From the Microsoft point of view, my Activity concept would be buried under Windows Workflow Foundation or BizTalk Server.
satellite packages
SonghayCore.xUnit
Defines reusable class definitions for xUnit. Featured is the ProjectFileDataAttribute
, allowing test data files to be loaded from a relative path.
NuGet package 📦: SonghayCore.xUnit
Documentation 📚: Songhay.Tests
SonghayCore.Newtonsoft
Core reusable, opinionated Newtonsoft concerns for my C# projects.
GitHub repo: https://github.com/BryanWilhite/SonghayCore.Newtonsoft
NuGet package 📦: SonghayCore.Newtonsoft
Studio packages dependent on SonghayCore
graph BT
netstandard2[.NET Standard 2.0]
net8[.NET 8.0]
1[SonghayCore]
2[SonghayCore.Newtonsoft]
net8-->1
netstandard2-->2
2-..->|optional addition|1
1-->3[SonghayCore.xUnit]
1-->4[Songhay.DataAccess]
1-->5[Songhay.Feeds]
1-->6[Songhay.Publications]
1-->7[Songhay.Social]
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 was computed. 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. |
-
net8.0
- Microsoft.Extensions.Hosting (>= 8.0.1)
- Polly (>= 8.5.2)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.Configuration.ConfigurationManager (>= 8.0.1)
- System.ServiceModel.Syndication (>= 8.0.0)
- Tavis.UriTemplates (>= 2.0.0)
NuGet packages (7)
Showing the top 5 NuGet packages that depend on SonghayCore:
Package | Downloads |
---|---|
SonghayCore.MSTest
Extensions of Microsoft.VisualStudio.TestTools.UnitTesting.TestContext for Songhay VSTEST projects |
|
Songhay.Cloud.BlobStorage
Azure BLOB Storage Repositories for JSON files in the Cloud |
|
Songhay.Publications
Core reusable definitions for Songhay Studio Publications |
|
SonghayCore.xUnit
Extensions and Orderers for Songhay xUnit projects |
|
Songhay.Mvvm
Songhay Model, View, View-Model definitions for WPF (with Prism) |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
8.0.2 | 292 | 6/10/2025 |
8.0.1 | 162 | 5/6/2025 |
8.0.0 | 2,063 | 1/30/2025 |
6.1.4 | 1,987 | 6/26/2024 |
6.1.3 | 107 | 6/26/2024 |
6.1.2 | 213 | 6/8/2024 |
6.1.1 | 200 | 2/20/2024 |
6.1.0 | 183 | 1/29/2024 |
6.0.4 | 546 | 11/1/2022 |
6.0.3 | 487 | 10/17/2022 |
6.0.2 | 473 | 10/17/2022 |
6.0.1 | 1,135 | 7/23/2022 |
6.0.0 | 1,066 | 7/17/2022 |
5.2.2 | 1,033 | 5/21/2022 |
5.2.1 | 2,203 | 6/26/2021 |
5.2.0 | 1,436 | 6/7/2021 |
5.1.2 | 2,715 | 5/16/2021 |
5.1.1 | 1,336 | 5/15/2021 |
5.1.0 | 933 | 5/15/2021 |
5.0.0 | 4,101 | 1/1/2021 |
3.2.20 | 1,990 | 7/12/2020 |
3.2.19 | 2,840 | 6/28/2020 |
3.2.18 | 2,315 | 2/13/2020 |
3.2.17 | 2,318 | 12/25/2019 |
3.2.16 | 2,178 | 12/17/2019 |
3.2.15 | 3,266 | 12/5/2019 |
3.2.14 | 1,448 | 12/5/2019 |
3.2.13 | 1,462 | 12/5/2019 |
3.2.12 | 2,159 | 11/29/2019 |
3.2.11 | 652 | 11/29/2019 |
3.2.10 | 2,485 | 11/28/2019 |
3.2.9 | 2,910 | 11/23/2019 |
3.2.8 | 2,780 | 11/18/2019 |
3.2.7 | 1,560 | 9/26/2019 |
3.2.6 | 784 | 8/6/2019 |
3.2.5 | 1,639 | 7/12/2019 |
3.2.4 | 707 | 7/12/2019 |
3.2.3 | 1,927 | 6/10/2019 |
3.2.2 | 1,323 | 6/8/2019 |
3.2.1 | 1,064 | 5/31/2019 |
3.2.0 | 1,887 | 5/18/2019 |
3.1.2 | 815 | 5/14/2019 |
3.1.1 | 842 | 5/14/2019 |
3.1.0 | 820 | 5/14/2019 |
3.0.0 | 1,611 | 5/8/2019 |
2.8.8 | 1,147 | 1/30/2019 |
2.8.7 | 6,946 | 9/14/2018 |
2.8.6 | 2,741 | 8/29/2018 |
2.8.5 | 1,503 | 6/1/2018 |
2.8.4 | 2,246 | 4/26/2018 |
2.8.3 | 1,374 | 4/26/2018 |
2.8.2 | 1,369 | 4/25/2018 |
2.8.1 | 2,070 | 3/21/2018 |
2.8.0 | 1,821 | 3/16/2018 |
2.7.4 | 1,909 | 3/12/2018 |
2.7.3 | 1,384 | 3/9/2018 |
2.7.2 | 1,156 | 3/8/2018 |
2.7.1 | 1,432 | 3/7/2018 |
2.7.0 | 1,414 | 3/1/2018 |
2.6.5 | 1,499 | 2/4/2018 |
2.6.4 | 1,334 | 1/25/2018 |
2.6.3 | 1,362 | 1/24/2018 |
2.6.2 | 3,543 | 1/23/2018 |
2.6.1 | 1,389 | 1/22/2018 |
2.6.0 | 1,412 | 1/22/2018 |
2.5.4 | 1,229 | 11/26/2017 |
2.5.3 | 1,183 | 11/24/2017 |
2.5.2 | 1,203 | 11/11/2017 |
2.5.1 | 1,188 | 11/11/2017 |
2.5.0 | 1,195 | 11/11/2017 |
2.4.0 | 1,780 | 11/4/2017 |
2.3.1 | 4,240 | 10/29/2017 |
2.3.0 | 1,524 | 10/27/2017 |
2.2.1 | 1,146 | 10/23/2017 |
2.1.1 | 1,195 | 10/23/2017 |
2.1.0 | 1,198 | 10/23/2017 |
2.0.0 | 1,157 | 10/20/2017 |
1.7.1 | 1,267 | 7/31/2017 |
1.7.0 | 1,247 | 6/1/2017 |
1.6.7 | 1,318 | 4/17/2017 |
1.6.6 | 1,255 | 4/16/2017 |
1.6.5 | 1,266 | 4/16/2017 |
1.6.4 | 1,257 | 4/16/2017 |
1.6.3 | 1,196 | 4/13/2017 |
1.6.2 | 1,272 | 3/9/2017 |
1.6.1 | 1,352 | 10/18/2016 |
1.6.0 | 1,305 | 10/18/2016 |
1.5.0 | 1,270 | 10/17/2016 |
1.4.0 | 1,301 | 10/15/2016 |
1.3.0 | 1,275 | 10/11/2016 |
1.2.0 | 1,686 | 9/24/2016 |
1.1.0 | 1,674 | 9/22/2016 |
1.0.1 | 1,339 | 8/31/2016 |
1.0.0 | 5,154 | 8/25/2016 |