{"id":23730977,"url":"https://github.com/bryanwilhite/songhay.helloworlds.activities","last_synced_at":"2026-02-13T05:02:29.127Z","repository":{"id":51972445,"uuid":"107832279","full_name":"BryanWilhite/Songhay.HelloWorlds.Activities","owner":"BryanWilhite","description":"a simple demonstration of the Songhay System Shell Activities architecture","archived":false,"fork":false,"pushed_at":"2025-03-02T03:50:22.000Z","size":479,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-31T07:11:47.951Z","etag":null,"topics":["architecture","asynchronous-programming","azure-functions","interface-based-programming","interfaces","shell","songhay"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BryanWilhite.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-10-22T02:45:44.000Z","updated_at":"2024-06-10T01:25:05.000Z","dependencies_parsed_at":"2025-05-26T09:33:31.819Z","dependency_job_id":null,"html_url":"https://github.com/BryanWilhite/Songhay.HelloWorlds.Activities","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BryanWilhite/Songhay.HelloWorlds.Activities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanWilhite%2FSonghay.HelloWorlds.Activities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanWilhite%2FSonghay.HelloWorlds.Activities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanWilhite%2FSonghay.HelloWorlds.Activities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanWilhite%2FSonghay.HelloWorlds.Activities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BryanWilhite","download_url":"https://codeload.github.com/BryanWilhite/Songhay.HelloWorlds.Activities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanWilhite%2FSonghay.HelloWorlds.Activities/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266856067,"owners_count":23995622,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","asynchronous-programming","azure-functions","interface-based-programming","interfaces","shell","songhay"],"created_at":"2024-12-31T03:15:23.050Z","updated_at":"2026-02-13T05:02:24.101Z","avatar_url":"https://github.com/BryanWilhite.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Songhay System Activities example\n\nThis is a simple demonstration of the Songhay System Activities ‘tiny’ architecture, running in the shell and in a serverless context.\n\nSonghay System Activities is part of the `SonghayCore` [repo](https://github.com/BryanWilhite/SonghayCore). It is intended to encapsulate and decouple “business logic” running in:\n\n- any .NET Shell\n- any .NET ASP.NET context, including Azure Functions\n- any .NET Service context of [a modular desktop application](https://prismlibrary.github.io/docs/wpf/legacy/Modules.html)\n\n## key class definitions\n\nSonghay System Activities depends on these key definitions:\n\n- The `IActivity` [interface](https://github.com/BryanWilhite/SonghayCore/blob/master/SonghayCore/Models/IActivity.cs). This interface defines the _Activity_.\n- The `IActivity` lazy loading [extension methods](https://github.com/BryanWilhite/SonghayCore/blob/master/SonghayCore/Extensions/IActivityExtensions.Lazy.cs), featuring support for `Dictionary\u003cstring, Lazy\u003cIActivity\u003e\u003e` that is used in the `ActivitiesGetter` [class](./Songhay.HelloWorlds.Activities/ActivitiesGetter.cs).\n- The `IActivityOutput` [interface](https://github.com/BryanWilhite/SonghayCore/blob/master/SonghayCore/Models/IActivityOutput.cs) extends `IActivity` with fundamental input/output, allowing the Activity to support both synchronous activity (usually for a Shell application) and asynchronous output (usually for everything else).\n- The `ActivitiesGetter` [class](./Songhay.HelloWorlds.Activities/ActivitiesGetter.cs). The central store of the Activities. It reveals the convention that an Activity is called by its class name from the command line. This implies that the first argument of the shell command refers to the name of the Activity and all other arguments are passed directly to the Activity.\n\n## running from the command line\n\nThe `tasks.json` [file](../.vscode/tasks.json) for Visual Studio Code contains the commands used to run builds. For example, to run the release from [the shell project folder](./Songhay.HelloWorlds.Shell) enter:\n\n```bash\ndotnet run --configuration Release -- GetHelloWorldActivity --world-name Saturn\n```\n\n## history and some FAQs\n\nSonghay Shell Activities is a replacement for the retired Data Activity Runner (DAR), previously on CodePlex.\n\n### why are you using `TraceSource`?\n\nThe use of `TraceSource` is detailed in my ‘.NET Core `TextWriterTraceListener`’ [sample](https://github.com/BryanWilhite/dotnet-core/tree/master/dotnet-console-textwritertracelistener).\n\n### why are you not using an IoC container?\n\nBased on my current and often limited understanding, the “opportunity” to use an IoC container comes when there is a need to use multiple instances of the `ActivitiesGetter` [class](./Songhay.HelloWorlds.Activities/ActivitiesGetter.cs). This is a level of real-world complexity beyond the scope of the intent here.\n\nLater I may discover through the “kindness” of others that my use of lazy-loading dictionary to get instances of `IActivity` by default should actually be replaced by an IoC container with, say, [hierarchy features](http://unitycontainer.org/tutorials/hierarchies.html).\n\n@[BryanWilhite](https://twitter.com/BryanWilhite)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryanwilhite%2Fsonghay.helloworlds.activities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbryanwilhite%2Fsonghay.helloworlds.activities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryanwilhite%2Fsonghay.helloworlds.activities/lists"}