diff --git a/Templates.csproj b/Templates.csproj
index 337c8bc..6e34674 100644
--- a/Templates.csproj
+++ b/Templates.csproj
@@ -9,30 +9,9 @@
dotnet-new;templates;
-
- https://github.com/kurmann/Templates
- git
-
Vorlagen für .NET-Entwicklung im Kurmann-Namespace.
-
- 0.4.1
-
-
- Siehe README.md für Details.
-
README.md
LICENSE
PackageIcon.png
diff --git a/templates/entities-repo/.github/workflows/draft_release.yml b/templates/entities-repo/.github/workflows/draft_release.yml
index ed29a85..ac36b68 100644
--- a/templates/entities-repo/.github/workflows/draft_release.yml
+++ b/templates/entities-repo/.github/workflows/draft_release.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
env:
- CSPROJ_FILE: src/ProjectName/ProjectName.csproj
+ CSPROJ_FILE: src/Entities/Entities.csproj
DOTNET_VERSION: '8.0.x'
steps:
diff --git a/templates/entities-repo/.github/workflows/publish_package.yml b/templates/entities-repo/.github/workflows/publish_package.yml
index 3e83cc1..507aa1a 100644
--- a/templates/entities-repo/.github/workflows/publish_package.yml
+++ b/templates/entities-repo/.github/workflows/publish_package.yml
@@ -11,7 +11,7 @@ permissions:
pull-requests: read
env:
- CSPROJ_FILE: src/ProjectName/ProjectName.csproj
+ CSPROJ_FILE: src/Entities/Entities.csproj
DOTNET_VERSION: '8.0.x'
jobs:
diff --git a/templates/entities-repo/src/Entities/Entities.csproj b/templates/entities-repo/src/Entities/Entities.csproj
index 5b49ef6..a7a2f1f 100644
--- a/templates/entities-repo/src/Entities/Entities.csproj
+++ b/templates/entities-repo/src/Entities/Entities.csproj
@@ -11,32 +11,11 @@
NamespacePlaceholder.ProjectName
- Kurmann;Entities
-
-
-
- git
+ NamespacePlaceholder
ProjectDescription
-
- 0.1.0
-
-
- Siehe README.md für Details.
-
README.md
diff --git a/templates/nuget-classlib/ClassLibrary/ClassLibrary.csproj b/templates/nuget-classlib/ClassLibrary/ClassLibrary.csproj
index 13f0347..9ad7372 100644
--- a/templates/nuget-classlib/ClassLibrary/ClassLibrary.csproj
+++ b/templates/nuget-classlib/ClassLibrary/ClassLibrary.csproj
@@ -11,19 +11,11 @@
Kurmann.ClassLibrary
- Videoschnitt
-
-
-
- git
+ RootNamespace
-
- 0.1.0-alpha
-
diff --git a/templates/services-repo/.devcontainer/devcontainer.json b/templates/services-repo/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..cacce45
--- /dev/null
+++ b/templates/services-repo/.devcontainer/devcontainer.json
@@ -0,0 +1,11 @@
+{
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "GitHub.copilot",
+ "GitHub.vscode-github-actions",
+ "ms-dotnettools.csdevkit"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/services-repo/.github/release-drafter-config.yml b/templates/services-repo/.github/release-drafter-config.yml
new file mode 100644
index 0000000..38addb3
--- /dev/null
+++ b/templates/services-repo/.github/release-drafter-config.yml
@@ -0,0 +1,39 @@
+# Konfigurationsdatei für das Release-Drafter-Tool.
+# release-drafter-config.yml
+
+# Definiert die Vorlage für den Namen des Releases.
+name-template: 'v$RESOLVED_VERSION' # Automatisch erhöhte Versionsnummer
+
+# Definiert die Vorlage für den Namen des Release-Tags.
+tag-template: 'v$RESOLVED_VERSION' # Automatisch erhöhte Versionsnummer
+
+# Kategorien für das Changelog, identifiziert durch Labels auf Pull Requests.
+categories:
+ - title: 'Features'
+ labels:
+ - 'enhancement'
+ - title: 'Bug Fixes'
+ labels:
+ - 'bug'
+ - title: 'Dokumentation'
+ labels:
+ - 'documentation'
+
+# Layout des Changelogs, formatiert nach den Änderungen in den Pull Requests.
+template: |
+ ## Änderungen
+ $CHANGES
+
+# Version-Resolver bestimmt die Art der Versionserhöhung basierend auf den PR Labels.
+version-resolver:
+ major:
+ labels:
+ - 'breaking'
+ minor:
+ labels:
+ - 'enhancement'
+ patch:
+ labels:
+ - 'bug'
+ - 'documentation'
+ default: minor
diff --git a/templates/services-repo/.github/workflows/draft_release.yml b/templates/services-repo/.github/workflows/draft_release.yml
new file mode 100644
index 0000000..6d23ec0
--- /dev/null
+++ b/templates/services-repo/.github/workflows/draft_release.yml
@@ -0,0 +1,45 @@
+name: Draft Release
+
+on:
+ push:
+ branches:
+ - '**'
+ workflow_dispatch:
+
+permissions:
+ contents: write
+ pull-requests: read
+
+jobs:
+ build_and_test:
+ runs-on: ubuntu-latest
+
+ env:
+ CSPROJ_FILE: src/Services/Services.csproj
+ DOTNET_VERSION: '8.0.x'
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Install dependencies
+ run: dotnet restore ${{ env.CSPROJ_FILE }}
+
+ - name: Test
+ run: dotnet test ${{ env.CSPROJ_FILE }}
+
+ release_draft:
+ runs-on: ubuntu-latest
+ needs: build_and_test
+ steps:
+ - uses: actions/checkout@v4
+ - name: Run Release Drafter
+ uses: release-drafter/release-drafter@v6
+ with:
+ config-name: 'release-drafter-config.yml'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/templates/services-repo/.github/workflows/publish_package.yml b/templates/services-repo/.github/workflows/publish_package.yml
new file mode 100644
index 0000000..3a4f042
--- /dev/null
+++ b/templates/services-repo/.github/workflows/publish_package.yml
@@ -0,0 +1,101 @@
+name: Publish NuGet Package on Release
+
+on:
+ release:
+ types: [published, prereleased]
+ workflow_dispatch:
+
+permissions:
+ contents: write
+ packages: write
+ pull-requests: read
+
+env:
+ CSPROJ_FILE: src/Services/Services.csproj
+ DOTNET_VERSION: '8.0.x'
+
+jobs:
+ get_release_or_prerelease:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Get latest release or prerelease
+ id: get_release_or_prerelease
+ run: |
+ RELEASES_JSON=$(gh release list --json tagName,name,isPrerelease --exclude-drafts)
+ LATEST_RELEASE_OR_PRERELEASE_JSON=$(echo "$RELEASES_JSON" | jq -r '.[0]')
+
+ RELEASE_TAG_NAME=$(echo "$LATEST_RELEASE_OR_PRERELEASE_JSON" | jq -r '.tagName')
+ RELEASE_NAME=$(echo "$LATEST_RELEASE_OR_PRERELEASE_JSON" | jq -r '.name')
+ RELEASE_IS_PRERELEASE=$(echo "$LATEST_RELEASE_OR_PRERELEASE_JSON" | jq -r '.isPrerelease')
+ RELEASE_VERSION="${RELEASE_TAG_NAME#"v"}"
+
+ REPO_URL="https://github.com/${GITHUB_REPOSITORY}"
+ RELEASE_URL="${REPO_URL}/releases/tag/${RELEASE_TAG_NAME}"
+
+ echo "release_version=$RELEASE_VERSION" >> "$GITHUB_OUTPUT"
+ echo "release_tag_name=$RELEASE_TAG_NAME" >> "$GITHUB_OUTPUT"
+ echo "release_url=$RELEASE_URL" >> "$GITHUB_OUTPUT"
+ echo "release_is_prerelease=$RELEASE_IS_PRERELEASE" >> "$GITHUB_OUTPUT"
+
+ echo "Found latest $(if [ "$RELEASE_IS_PRERELEASE" = "true" ]; then echo "prerelease"; else echo "release"; fi): $RELEASE_TAG_NAME"
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ outputs:
+ release_version: ${{ steps.get_release_or_prerelease.outputs.release_version }}
+ release_tag_name: ${{ steps.get_release_or_prerelease.outputs.release_tag_name }}
+ release_url: ${{ steps.get_release_or_prerelease.outputs.release_url }}
+ release_is_prerelease: ${{ steps.get_release_or_prerelease.outputs.release_is_prerelease }}
+
+ build_and_publish:
+ needs: get_release_or_prerelease
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Restore dependencies
+ run: dotnet restore ${{ env.CSPROJ_FILE }}
+
+ - name: Build
+ run: dotnet build ${{ env.CSPROJ_FILE }} --no-restore --configuration Release
+
+ - name: Pack
+ run: |
+ echo "Using version ${{ needs.get_release_or_prerelease.outputs.release_version }} from setup job."
+ dotnet pack ${{ env.CSPROJ_FILE }} --no-build --configuration Release \
+ -p:PackageVersion=${{ needs.get_release_or_prerelease.outputs.release_version }} \
+ -p:PackageReleaseNotes=${{ needs.get_release_or_prerelease.outputs.release_url }} \
+ -p:PackageProjectUrl="https://github.com/${{ github.repository }}" \
+ -p:RepositoryUrl="https://github.com/${{ github.repository }}.git" \
+ -p:RepositoryType="git" \
+ --include-symbols -p:SymbolPackageFormat=snupkg \
+ -o nupkgs
+ shell: bash
+
+ - name: List output files
+ run: |
+ echo "Listing built packages in nupkgs directory:"
+ ls nupkgs/
+ shell: bash
+
+ - name: Push NuGet Package
+ run: |
+ cd nupkgs
+ dotnet nuget push "*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
+ shell: pwsh
+
+ - name: Push to GitHub Packages
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ cd nupkgs
+ dotnet nuget push "*.nupkg" --api-key $env:GITHUB_TOKEN --source "https://nuget.pkg.github.com/${{ github.repository_owner }}" --skip-duplicate
+ shell: pwsh
+
+
diff --git a/templates/services-repo/.gitignore b/templates/services-repo/.gitignore
new file mode 100644
index 0000000..df82eb7
--- /dev/null
+++ b/templates/services-repo/.gitignore
@@ -0,0 +1,416 @@
+# MacOS files
+.DS_Store
+
+# Created by https://www.toptal.com/developers/gitignore/api/visualstudio,blazor,azurefunctions
+# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,blazor,azurefunctions
+
+### AzureFunctions ###
+# Azure Functions localsettings file
+local.settings.json
+
+### GitHub Codespaces ###
+## Ignore mono directory
+.mono
+
+### VisualStudio ###
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# VS Code files for those working on multiple tools
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+# Windows Installer files from build outputs
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# JetBrains Rider
+*.sln.iml
+
+### VisualStudio Patch ###
+# Additional files built by Visual Studio
+
+# End of https://www.toptal.com/developers/gitignore/api/visualstudio,blazor,azurefunctions
diff --git a/templates/services-repo/.template.config/template.json b/templates/services-repo/.template.config/template.json
new file mode 100644
index 0000000..a2e1e5f
--- /dev/null
+++ b/templates/services-repo/.template.config/template.json
@@ -0,0 +1,53 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Patrick Kurmann",
+ "classifications": [
+ "Kurmann",
+ "GitHub",
+ "Repository",
+ "Services"
+ ],
+ "identity": "Kurmann.GitHub.Repository.Services",
+ "name": "Kurmann Services GitHub Repository",
+ "shortName": "classlib-repo",
+ "sourceName": "ProjectName",
+ "description": "GitHub repository template containing .NET service classlib with integration test application, gitignore, and GitHub Actions for NuGet package publishing.",
+ "tags": {
+ "language": "C#",
+ "type": "solution"
+ },
+ "preferNameDirectory": true,
+ "sources": [
+ {
+ "modifiers": [
+ {
+ "exclude": [
+ ".vs/**",
+ ".template_config/**",
+ "**/bin/**",
+ "**/obj/**",
+ "/bin/**",
+ "/obj/**",
+ "/TestResults/**",
+ ".git/**",
+ "nuget.csproj"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "namespace": {
+ "type": "parameter",
+ "description": "The root namespace for the project e.g 'Kurmann.Videoschnitt'",
+ "defaultValue": "Kurmann",
+ "replaces": "NamespacePlaceholder"
+ },
+ "description": {
+ "type": "parameter",
+ "description": "The project short description.",
+ "defaultValue": "",
+ "replaces": "ProjectDescription"
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/services-repo/LICENSE b/templates/services-repo/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/templates/services-repo/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/templates/services-repo/PackageIcon.png b/templates/services-repo/PackageIcon.png
new file mode 100644
index 0000000..85e474f
Binary files /dev/null and b/templates/services-repo/PackageIcon.png differ
diff --git a/templates/services-repo/README.md b/templates/services-repo/README.md
new file mode 100644
index 0000000..5db0a0e
--- /dev/null
+++ b/templates/services-repo/README.md
@@ -0,0 +1,31 @@
+# ProjectName
+
+Namespace: **NamespacePlaceholder**
+
+ProjectDescription
+
+## Mitwirken
+
+Derzeit entwickle ich das Projekt im Alleingang. Als dreifacher Familienvater bin ich für jede Unterstützung und Weiterentwicklungen dankbar. Bitte erstellen Sie ein GitHub-Issue als Anfrage.
+
+## Lizenz
+
+Dieses Projekt ist unter der Apache-2.0-Lizenz lizenziert – siehe die Datei [LICENSE](LICENSE) für Details.
+
+## Kontakt
+
+Falls Sie Fragen haben oder Unterstützung benötigen, erstellen Sie bitte ein Issue im GitHub-Repository.
+
+## Änderungsverlauf
+
+Dieses Projekt hält sich an die Semantische Versionierung (SemVer).
+
+### Unveröffentlicht
+
+- Keine
+
+### 0.1 - YYYY-MM-DD
+
+#### Hinzugefügt
+
+- Projekt erstellt und als NuGet-Paket veröffentlicht
diff --git a/templates/services-repo/src/Application/Application.csproj b/templates/services-repo/src/Application/Application.csproj
new file mode 100644
index 0000000..b9cf0d0
--- /dev/null
+++ b/templates/services-repo/src/Application/Application.csproj
@@ -0,0 +1,23 @@
+
+
+
+ Exe
+ Dependency
+ net8.0
+ enable
+ enable
+ NamespacePlaceholder.ProjectName.Application.
+ NamespacePlaceholder.ProjectName.Application
+ false
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/services-repo/src/Application/Program.cs b/templates/services-repo/src/Application/Program.cs
new file mode 100644
index 0000000..2dd9941
--- /dev/null
+++ b/templates/services-repo/src/Application/Program.cs
@@ -0,0 +1,27 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+
+namespace NamespacePlaceholder.ProjectName.Application;
+
+internal class Program
+{
+ static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
+
+ public static IHostBuilder CreateHostBuilder(string[] args)
+ {
+ return Host.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration((hostingContext, config) =>
+ {
+ if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development)
+ {
+ // execute "dotnet user-secrets init" in the project folder to create the secrets.json file
+ // add specific secrets with "dotnet user-secrets set "Kurmann:Videoschnitt:MikaModule:SampleSetting" "Secret Value""
+ config.AddUserSecrets();
+ }
+ })
+ .ConfigureServices((hostContext, services) =>
+ {
+ services.AddProjectName(hostContext.Configuration);
+ });
+ }
+}
diff --git a/templates/services-repo/src/ProjectName.sln b/templates/services-repo/src/ProjectName.sln
new file mode 100644
index 0000000..ad5c799
--- /dev/null
+++ b/templates/services-repo/src/ProjectName.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{D24DEA42-1B81-41AA-8C97-5EB79278507C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Services\Services.csproj", "{C90E826D-0F3D-47DD-B33B-B52CA29FA3A7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D24DEA42-1B81-41AA-8C97-5EB79278507C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D24DEA42-1B81-41AA-8C97-5EB79278507C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D24DEA42-1B81-41AA-8C97-5EB79278507C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D24DEA42-1B81-41AA-8C97-5EB79278507C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C90E826D-0F3D-47DD-B33B-B52CA29FA3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C90E826D-0F3D-47DD-B33B-B52CA29FA3A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C90E826D-0F3D-47DD-B33B-B52CA29FA3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C90E826D-0F3D-47DD-B33B-B52CA29FA3A7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/templates/services-repo/src/Services/Commands/ICommand.cs b/templates/services-repo/src/Services/Commands/ICommand.cs
new file mode 100644
index 0000000..c03917e
--- /dev/null
+++ b/templates/services-repo/src/Services/Commands/ICommand.cs
@@ -0,0 +1,8 @@
+using CSharpFunctionalExtensions;
+
+namespace NamespacePlaceholder.ProjectName.Commands;
+
+public interface ICommand
+{
+ Result Execute();
+}
\ No newline at end of file
diff --git a/templates/services-repo/src/Services/Commands/SampleModule.cs b/templates/services-repo/src/Services/Commands/SampleModule.cs
new file mode 100644
index 0000000..801032a
--- /dev/null
+++ b/templates/services-repo/src/Services/Commands/SampleModule.cs
@@ -0,0 +1,20 @@
+using CSharpFunctionalExtensions;
+
+namespace NamespacePlaceholder.ProjectName.Commands;
+
+public class SampleCommand(string? sampleParameter) : ICommand
+{
+ private readonly string? sampleParameter = sampleParameter;
+
+ public Result Execute()
+ {
+ if (string.IsNullOrWhiteSpace(sampleParameter))
+ return Result.Failure("Sample parameter cannot be empty");
+
+ var commandResult = new SampleCommandResult(sampleParameter);
+
+ return Result.Success(commandResult);
+ }
+}
+
+public record SampleCommandResult(string Result);
\ No newline at end of file
diff --git a/templates/services-repo/src/Services/ProjectNameSettings.cs b/templates/services-repo/src/Services/ProjectNameSettings.cs
new file mode 100644
index 0000000..482c7e3
--- /dev/null
+++ b/templates/services-repo/src/Services/ProjectNameSettings.cs
@@ -0,0 +1,8 @@
+namespace NamespacePlaceholder.ProjectName;
+
+public class ProjectNameSettings
+{
+ public const string SectionName = "NamespacePlaceholder.ProjectName";
+
+ public string SampleSetting { get; set; } = "Sample Value";
+}
\ No newline at end of file
diff --git a/templates/services-repo/src/Services/Queries/IQueryService.cs b/templates/services-repo/src/Services/Queries/IQueryService.cs
new file mode 100644
index 0000000..5745fad
--- /dev/null
+++ b/templates/services-repo/src/Services/Queries/IQueryService.cs
@@ -0,0 +1,8 @@
+using CSharpFunctionalExtensions;
+
+namespace NamespacePlaceholder.ProjectName.Queries;
+
+public interface IQueryService
+{
+ public Result Execute();
+}
\ No newline at end of file
diff --git a/templates/services-repo/src/Services/Queries/SampleQuery.cs b/templates/services-repo/src/Services/Queries/SampleQuery.cs
new file mode 100644
index 0000000..4d13b6b
--- /dev/null
+++ b/templates/services-repo/src/Services/Queries/SampleQuery.cs
@@ -0,0 +1,20 @@
+using CSharpFunctionalExtensions;
+
+namespace NamespacePlaceholder.ProjectName.Queries;
+
+public class SampleQuery(string? sampleParameter) : IQueryService
+{
+ private readonly string? sampleParameter = sampleParameter;
+
+ public Result Execute()
+ {
+ if (string.IsNullOrWhiteSpace(sampleParameter))
+ return Result.Failure("Sample parameter cannot be empty");
+
+ var sampleEntity = new SampleQueryResult(sampleParameter);
+
+ return Result.Success(sampleEntity);
+ }
+}
+
+public record SampleQueryResult(string Result);
\ No newline at end of file
diff --git a/templates/services-repo/src/Services/ServiceCollection.cs b/templates/services-repo/src/Services/ServiceCollection.cs
new file mode 100644
index 0000000..3734bbe
--- /dev/null
+++ b/templates/services-repo/src/Services/ServiceCollection.cs
@@ -0,0 +1,21 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Configuration;
+using NamespacePlaceholder.ProjectName.Services;
+
+namespace NamespacePlaceholder.ProjectName;
+
+public static class ServiceCollectionExtensions
+{
+ public static IServiceCollection AddProjectName(
+ this IServiceCollection services,
+ IConfiguration configuration)
+ {
+ // Bindet Root-Konfigurationswerte an ProjectNameSettings
+ services.Configure(configuration.GetSection(ProjectNameSettings.SectionName));
+
+ // Dienste hinzufügen
+ services.AddHostedService();
+
+ return services;
+ }
+}
diff --git a/templates/services-repo/src/Services/Services.csproj b/templates/services-repo/src/Services/Services.csproj
new file mode 100644
index 0000000..54ab679
--- /dev/null
+++ b/templates/services-repo/src/Services/Services.csproj
@@ -0,0 +1,47 @@
+
+
+
+
+ net8.0
+ enable
+ enable
+
+ NamespacePlaceholder.ProjectName
+ NamespacePlaceholder.ProjectName
+ NamespacePlaceholder.ProjectName
+
+
+ NamespacePlaceholder
+
+
+ ProjectDescription
+
+
+ README.md
+
+
+ LICENSE
+
+
+ PackageIcon.png
+
+
+ true
+ true
+ content
+
+
+ true
+ snupkg
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/services-repo/src/Services/Services/SampleHostedService.cs b/templates/services-repo/src/Services/Services/SampleHostedService.cs
new file mode 100644
index 0000000..428443e
--- /dev/null
+++ b/templates/services-repo/src/Services/Services/SampleHostedService.cs
@@ -0,0 +1,50 @@
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+
+namespace NamespacePlaceholder.ProjectName.Services;
+
+public class SampleHostedService(ILogger logger, IOptionsSnapshot options) : IHostedService, IDisposable
+{
+ private readonly ILogger _logger = logger;
+ private readonly ProjectNameSettings _options = options.Value;
+ private Timer? _timer;
+
+ public Task StartAsync(CancellationToken cancellationToken)
+ {
+ _logger.LogInformation("Sample Service is starting.");
+
+ if (string.IsNullOrEmpty(_options.SampleSetting))
+ {
+ _logger.LogWarning("SampleSetting is not set in configuration.");
+ }
+ else
+ {
+ _logger.LogInformation("SampleSetting has been successfully loaded from configuration");
+ }
+
+ _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
+
+ return Task.CompletedTask;
+ }
+
+ private void DoWork(object? state)
+ {
+ _logger.LogInformation("Sample Service is working. Current time: {time}", DateTimeOffset.Now);
+ }
+
+ public Task StopAsync(CancellationToken cancellationToken)
+ {
+ _logger.LogInformation("Sample Service is stopping.");
+
+ _timer?.Change(Timeout.Infinite, 0);
+
+ return Task.CompletedTask;
+ }
+
+ public void Dispose()
+ {
+ _timer?.Dispose();
+ GC.SuppressFinalize(this);
+ }
+}
\ No newline at end of file