Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CICoverageDuplicated Lines (%)

📖 BookWorm: A Practical .NET Aspire Application

Introduction

⭐ BookWorm demonstrates the practical implementation of .NET Aspire in a cloud-native application. The project employs Domain-Driven Design (DDD) and Vertical Slice Architecture to organize the codebase effectively.

Open in GitHub Codespaces

Project Goals

  • Developed a cloud-native application using .NET Aspire
  • Implemented Vertical Slice Architecture with Domain-Driven Design & CQRS
  • Enabled service-to-service communication with gRPC
  • Incorporated various microservices patterns
    • Utilized outbox and inbox patterns to manage commands and events
    • Implemented saga patterns for orchestration and choreography
    • Integrated event sourcing for storing domain events
    • Implemented a microservices chassis for cross-cutting concerns and service infrastructure
  • Implemented API versioning and feature flags for flexible application management
  • Set up AuthN/AuthZ with Keycloak (see here)
  • Implemented caching with HybridCache
  • Incorporated AI components:
    • Text embedding with Nomic Embed Text
    • Integrated chatbot functionality using Gemma 3
    • Standardized AI tooling with Model Context Protocol (MCP)
    • Orchestrated multi-agent workflows using Semantic Kernel
    • Enabled agent-to-agent communication via A2A Protocol
  • Configured CI/CD with GitHub Actions
  • Created comprehensive documentation:
    • Used OpenAPI for REST API & AsyncAPI for event-driven endpoints
    • Utilized EventCatalog for centralized architecture documentation
  • Established a testing strategy:
    • Conducted service unit tests
    • Established architecture testing strategy
    • Performed load testing with k6 (see testing suite)
    • Planned integration tests

Project Architecture

Project Architecture

Getting Started

Prerequisites

Note

Email services use SendGrid in production and Mailpit locally.

Run the Application

  1. Clone the repository

    git clone git@github.com:foxminchan/BookWorm.git
  2. Navigate to the project directory

    cd BookWorm
  3. Run the application

    just run

Important

  • Docker or Podman must be running on your machine before starting the application.
  • For GPU support with AI components, install GPU drivers and run just gpu 1.
  • Run just help to see all available commands.

Deploy the application

You can use the Azure Developer CLI to run this project on Azure with only a few commands. Follow the next instructions:

  • Install the latest or update to the latest Azure Developer CLI (azd).
  • Log in azd (if you haven't done it before) to your Azure account:
azd auth login
  • Enable the azd alpha features to support bind mounts:
azd config set alpha.azd.operations on
  • Initialize azd from the root of the repository.
azd init
  • During initialization, you will be prompted to select the project type and services to expose. Follow these steps:

    • Select Use code in the current directory. Azd will automatically detect the .NET Aspire project.
    • Confirm .NET (Aspire) and continue.
    • Select which services to expose to the Internet (exposing gateway is enough to test the sample).
    • Finalize the initialization by giving a name to your environment.
  • Create Azure resources and deploy the sample by running:

azd up

Note

  • The operation takes a few minutes the first time it is ever run for an environment.
  • At the end of the process, azd will display the url for the webapp. Follow that link to test the sample.
  • You can run azd up after saving changes to the sample to re-deploy and update the sample.
  • Report any issues to azure-dev repo.
  • FAQ and troubleshoot for azd.
  • For cleaning up the resources created by azd, run:
az group delete --name rg-<your-environment-name> --yes --no-wait

Event-Driven Architecture

Explore our event catalog for messaging patterns and API details.

Architecture Documentation

For comprehensive architecture documentation, refer to the arc42 documentation.

Contributing

Contributions are welcome! Please read the contribution guidelines and code of conduct to learn how to participate.

Support

  • If you like this project, please give it a ⭐ star.
  • If you have any issues or feature requests, please create an issue.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

The practical implementation of .NET Aspire using Microservices

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages