Giter Site home page Giter Site logo

thangchung / clean-architecture-dotnet Goto Github PK

View Code? Open in Web Editor NEW
1.2K 37.0 244.0 4.8 MB

🕸 Yet Another .NET Clean Architecture, but for Microservices project. It uses Minimal Clean Architecture with DDD-lite, CQRS-lite, and just enough Cloud-native patterns apply on the simple eCommerce sample and run on Tye with Dapr extension 🍻

License: MIT License

C# 100.00%
ddd ddd-architecture ddd-patterns clean-architecture microservices microservices-architecture mediatr cqrs kubernetes containers

clean-architecture-dotnet's Introduction

🔆 clean-architecture-dotnet

"Everything should be made as simple as possible, but not simpler." - Albert Einstein

"Mọi thứ đều nên đơn giản, càng đơn giản càng tốt, nhưng không nên đơn giản hơn bản chất của nó." - Vietnamese translated

We know that, and that's a reason we publish these libraries and samples. These are distillations with all best practices, tips, and tricks, and whatever made us spend a lot of time struggling to solve.

In the end of our journey, we would like to give these simplified and effortless libraries and samples as a reward for you. Enjoy the Minimal Clean Architecture, Domain-driven Design Lite, CQRS Lite, and just enough Cloud-native patterns!

Sparkline

DISCLAIMER

IMPORTANT: Because we are constantly evolving towards newly released technologies, .NET 6 is in the preview state so that it might change a lot in every release by the .NET team. So even we're trying to do the best for this OSS. But be careful if you use it for your project, and make sure that you do a stress test, benchmarking these libraries, and refactor them subsequently to adapt to your business carefully.

Feedback with improvements and pull requests from the community will be highly appreciated. Thank you!

⭐ Give a star

If you're using this repository for your learning, samples, workshop, or your project, please give a star. Thanks 👍

🎇 Business Usecases

🎇 High level context

🎇 ERD

🎇 Minimal DDD, CQRS, and Clean Architecture

  1. Domain-driven Design (a.k.a DDD) demonstrates it can help the business tidy and organized in many years. But it is hard to approach and use, we need to make it easier to use in real projects when we get started.

  2. Command and Query Responsibility Segregation (a.k.a CQRS) helps to separate components into command and query parts, but again it's really hard and might bloat when we get starting some of the project. We need something more lightweight, just like https://github.com/gautema/CQRSlite, but we might not need Event Sourcing in almost all projects.

  3. Clean Architecture helps the project structure easier to refactor and evolve in medium and big projects. Especially in the Microservice world, we always want to do and try with a lot of time in the project lifetime. The thing is boilerplate code in this kind of project to make components lose coupling.

=> When we jump in and set up the project for the Microservice approach. We want to apply all the best practices from the community, and some kind of patterns and architecture above sometimes makes us feel power off when start implements the first line of code which actually solves the business requirements. So the solution is we need something minimal and enough to get starting, and then when our business gets grows by the time, then we go back to add more. That's what's the practical way to go!

clean-architecture-dotnet is a collection of basic building blocks and project structure to help we get starting the project with less code boilerplate and effortless. We focus on the Microservice approach of how can we organize code, the project with the monorepo approach, and you can use it for modular monolith projects as well.

Reference to https://github.com/Sairyss/domain-driven-hexagon

💎 Prerequisites

♥️ Technical stacks

  • ✔️ .NET Core 6 - .NET Framework and .NET Core, including ASP.NET and ASP.NET Core
  • ✔️ MVC Versioning API - Set of libraries which add service API versioning to ASP.NET Web API, OData with ASP.NET Web API, and ASP.NET Core
  • ✔️ YARP - A toolkit for developing high-performance HTTP reverse proxy applications
  • ✔️ MediatR - Simple, unambitious mediator implementation in .NET
  • ✔️ EF Core - Modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations
  • ✔️ FluentValidation - Popular .NET validation library for building strongly-typed validation rules
  • ✔️ Swagger & Swagger UI - Swagger tools for documenting API's built on ASP.NET Core
  • ✔️ serilog - Simple .NET logging with fully-structured events
  • ✔️ Dapr dotnet-sdk - Dapr SDK for .NET
  • ✔️ RestEase - Easy-to-use typesafe REST API client library for .NET Standard 1.1 and .NET Framework 4.5 and higher, which is simple and customisable
  • ✔️ Polly - Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner
  • ✔️ Scrutor - Assembly scanning and decoration extensions for Microsoft.Extensions.DependencyInjection
  • ✔️ opentelemetry-dotnet - The OpenTelemetry .NET Client
  • ✔️ Blazor - WASM - Client web apps with C#
  • ✔️ BFF - Framework for ASP.NET Core to secure SPAs using the Backend-for-Frontend (BFF) pattern

🎇 All packages dependencies

✔️ Building blocks

+---N8T.Core
|   |   N8T.Core.csproj
|   |
|   +---Domain
|   |       Cqrs.cs
|   |       Entities.cs
|   |       Events.cs
|   |       Exceptions.cs
|   |
|   +---Helpers
|   |       DateTimeHelper.cs
|   |       GuidHelper.cs
|   |
|   +---Repository
|   |       IRepository.cs
|   |
|   \---Specification
|           And.cs
|           Extensions.cs
|           GridSpecificationBase.cs
|           ISpecification.cs
|           Negated.cs
|           Or.cs
|           PredicateBuilder.cs
|           SpecificationBase.cs
|
+---N8T.Infrastructure
|   |   AppOptions.cs
|   |   Extensions.cs
|   |   N8T.Infrastructure.csproj
|   |
|   +---Auth
|   |       AuthBehavior.cs
|   |       Extensions.cs
|   |       IAuthRequest.cs
|   |       ISecurityContextAccessor.cs
|   |       SecurityContextAccessor.cs
|   |
|   +---Bus
|   |   |   Extensions.cs
|   |   |   IEventBus.cs
|   |   |
|   |   \---Dapr
|   |       |   DaprEventBusOptions.cs
|   |       |
|   |       \---Internal
|   |               DaprEventBus.cs
|   |
|   +---Controller
|   |       BaseController.cs
|   |
|   +---Helpers
|   |       ConfigurationHelper.cs
|   |
|   +---Logging
|   |       Extensions.cs
|   |       LoggingBehavior.cs
|   |       TraceIdEnricher.cs
|   |
|   +---ServiceInvocation
|   |   \---Dapr
|   |           Extensions.cs
|   |
|   +---Status
|   |       Extensions.cs
|   |       StatusModel.cs
|   |
|   +---Swagger
|   |       ConfigureSwaggerOptions.cs
|   |       Extentions.cs
|   |       SwaggerDefaultValues.cs
|   |
|   +---TransactionalOutbox
|   |   |   Extensions.cs
|   |   |   OutboxEntity.cs
|   |   |
|   |   \---Dapr
|   |       |   DaprTransactionalOutboxOptions.cs
|   |       |   ITransactionalOutboxProcessor.cs
|   |       |
|   |       \---Internal
|   |               LocalDispatchedHandler.cs
|   |               TransactionalOutboxProcessor.cs
|   |
|   \---Validator
|           Extensions.cs
|           RequestValidationBehavior.cs
|           ValidationError.cs
|           ValidationException.cs
|           ValidationResultModel.cs
|
+---N8T.Infrastructure.EfCore
|   |   AppDbContextBase.cs
|   |   Consts.cs
|   |   DbContextDesignFactoryBase.cs
|   |   Extensions.cs
|   |   IDbFacadeResolver.cs
|   |   N8T.Infrastructure.EfCore.csproj
|   |   Repository.cs
|   |   TxBehavior.cs
|   |
|   \---Internal
|           DbContextMigratorHostedService.cs
|
\---N8T.Infrastructure.OTel
    |   Extensions.cs
    |   N8T.Infrastructure.OTel.csproj
    |
    \---MediatR
            OTelMediatROptions.cs
            OTelMediatRTracingBehavior.cs

✔️ Product service structure (microservice)

+---ProductService.Api
|   |   .dockerignore
|   |   appsettings.json
|   |   Dockerfile
|   |   ProductService.Api.csproj
|   |   Program.cs
|   |
|   +---Properties
|   |       launchSettings.json
|   |
|   \---V1
|           Anchor.cs
|           IntegrationEventHandler.cs
|           ProductController.cs
|           TransactionalOutboxProcessor.cs
|
+---ProductService.AppCore
|   |   Anchor.cs
|   |   ProductService.AppCore.csproj
|   |
|   +---Core
|   |   |   Product.cs
|   |   |   ProductCode.cs
|   |   |   Return.cs
|   |   |   ReturnReason.cs
|   |   |
|   |   \---Specs
|   |           ProductByIdQuerySpec.cs
|   |           ProductIsInStockSpec.cs
|   |           ProductListQuerySpec.cs
|   |           ProductReturnReasonSpec.cs
|   |
|   \---UseCases
|       +---Commands
|       |       CreateProduct.cs
|       |
|       \---Queries
|               GetProductById.cs
|               GetProducts.cs
|
\---ProductService.Infrastructure
    |   Anchor.cs
    |   Extensions.cs
    |   ProductService.Infrastructure.csproj
    |   readme.txt
    |
    \---Data
        |   MainDbContext.cs
        |   MainDbContextDesignFactory.cs
        |   Repository.cs
        |
        +---Migrations
        |       20210129103734_InitialProductionDb.cs
        |       20210129103734_InitialProductionDb.Designer.cs
        |       20210129104438_SeedInitData.cs
        |       20210129104438_SeedInitData.Designer.cs
        |       MainDbContextModelSnapshot.cs
        |
        \---Scripts
                20210129104438_SeedInitData.sql

🎇 Starting the APIs

$ cd samples
$ tye run
  • Public Apis:

Tye Dashboard: http://localhost:8000

Play around at restclient.http

No. Service name Service uri
1 YARP Gateway (downstream) http://localhost:5000
2 identity server https://localhost:5001
3 Web Blazor https://localhost:5002
4 product (upstream service) http://localhost:5003
5 customer (upstream service) http://localhost:5004
6 setting (upstream service) http://localhost:5005

🎇 Additional parts

Public CRUD interface

In medium and large software projects, we normally implement the CRUD actions over and over again. And it might take around 40-50% codebase just to do CRUD in the projects. The question is can we make standardized CRUD APIs, then we can use them in potential projects in the future? That is in my mind for a long time when I started and finished many projects, and I decide to take time to research and define the public interfaces for it as below

✔️ Common

public record ResultModel<T>(T Data, bool IsError = false, string? ErrorMessage = default);
public interface ICommand<T> : IRequest<ResultModel<T>> {}
public interface IQuery<T> : IRequest<ResultModel<T>> {}

✔️ [R]etrieve

// input model for list query (normally using for the table UI control with paging, filtering and sorting)
public interface IListQuery<TResponse> : IQuery<TResponse>
{
  public List<string> Includes { get; init; }
  public List<FilterModel> Filters { get; init; }
  public List<string> Sorts { get; init; }
  public int Page { get; init; }
  public int PageSize { get; init; }
}
// output model with items, total items, page and page size with serving for binding with the table UI control
public record ListResponseModel<T>(List<T> Items, long TotalItems, int Page, int PageSize);
public interface IItemQuery<TId, TResponse> : IQuery<TResponse>
{
  public List<string> Includes { get; init; }
  public TId Id { get; init; }
}

✔️ [C]reate

public interface ICreateCommand<TRequest, TResponse> : ICommand<TResponse>, ITxRequest
{
    public TRequest Model { get; init; }
}

✔️ [U]pdate

public interface IUpdateCommand<TRequest, TResponse> : ICommand<TResponse>, ITxRequest
{
  public TRequest Model { get; init; }
}

✔️ [D]elete

public interface IDeleteCommand<TId, TResponse> : ICommand<TResponse> where TId : struct
{
  public TId Id { get; init; }
}

Dapr components

✔️ Service Invocation

✔️ Event Bus

public interface IEventBus
{
  Task PublishAsync<TEvent>(TEvent @event, string[] topics = default, CancellationToken token = default) where TEvent : IDomainEvent;

  Task SubscribeAsync<TEvent>(string[] topics = default, CancellationToken token = default) where TEvent : IDomainEvent;
}
  • Dapr provider

✔️ Transactional Outbox

public class OutboxEntity
{
    [JsonInclude]
    public Guid Id { get; private set; }

    [JsonInclude]
    public DateTime OccurredOn { get; private set; }

    [JsonInclude]
    public string Type { get; private set; }

    [JsonInclude]
    public string Data { get; private set; }

    public OutboxEntity()
    {
        // only for System.Text.Json to deserialized data
    }

    public OutboxEntity(Guid id, DateTime occurredOn, IDomainEvent @event)
    {
        Id = id.Equals(Guid.Empty) ? Guid.NewGuid() : id;
        OccurredOn = occurredOn;
        Type = @event.GetType().FullName;
        Data = JsonConvert.SerializeObject(@event);
    }

    public virtual IDomainEvent RecreateMessage(Assembly assembly) => (IDomainEvent)JsonConvert.DeserializeObject(Data, assembly.GetType(Type)!);
}
  • Dapr provider

Sample pages

🎇 Credits

clean-architecture-dotnet's People

Contributors

cuno92 avatar thangchung avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

clean-architecture-dotnet's Issues

Cant build via docker in m1

` clean-architecture-dotnet git:(main) ✗ sudo docker-compose build --no-cache
postgresql uses an image, skipping
placement uses an image, skipping
redis uses an image, skipping
settingapp-dapr uses an image, skipping
customerapp-dapr uses an image, skipping
productapp-dapr uses an image, skipping
webapigatewayapp-dapr uses an image, skipping
Building settingapp
[+] Building 2.5s (15/17)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 680B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 35B 0.0s
=> [internal] load metadata for mcr.microsoft.com/dotnet/sdk:6.0 0.2s
=> [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:6.0 0.2s
=> [internal] load build context 0.1s
=> => transferring context: 33.98kB 0.1s
=> [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:6.0@sha256:1c008d2e442b82f7dd0118999f439c5641efdcd527f40b44bff6c273d8836a04 0.0s
=> [base 1/2] FROM mcr.microsoft.com/dotnet/aspnet:6.0@sha256:044457748f69c79c5617cbf3c2da389e8833d8bead76a6875e9df071868bc74c 0.0s
=> CACHED [build 2/7] WORKDIR /src 0.0s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> [build 3/7] COPY [samples/Setting/SettingService.Api/SettingService.Api.csproj, SettingService.Api/] 0.0s
=> [build 4/7] RUN dotnet restore "./SettingService.Api/SettingService.Api.csproj" 0.6s
=> [build 5/7] COPY . . 0.1s
=> [build 6/7] WORKDIR /src/SettingService.Api 0.0s
=> ERROR [build 7/7] RUN dotnet build "SettingService.Api.csproj" -c Release -o /app/build 1.4s

[build 7/7] RUN dotnet build "SettingService.Api.csproj" -c Release -o /app/build:
#15 0.214 Microsoft (R) Build Engine version 17.0.0-preview-21302-02+018bed83d for .NET
#15 0.214 Copyright (C) Microsoft Corporation. All rights reserved.
#15 0.214
#15 0.475 Determining projects to restore...
#15 0.477 Skipping project "/src/N8T.Core/N8T.Core.csproj" because it was not found.
#15 0.477 Skipping project "/src/N8T.Infrastructure.EfCore/N8T.Infrastructure.EfCore.csproj" because it was not found.
#15 0.477 Skipping project "/src/N8T.Infrastructure.OTel/N8T.Infrastructure.OTel.csproj" because it was not found.
#15 0.477 Skipping project "/src/N8T.Infrastructure/N8T.Infrastructure.csproj" because it was not found.
#15 0.477 Skipping project "/DataContracts/CoolStore.AppContracts/CoolStore.AppContracts.csproj" because it was not found.
#15 0.477 Skipping project "/DataContracts/CoolStore.IntegrationEvents/CoolStore.IntegrationEvents.csproj" because it was not found.
#15 0.477 Skipping project "/src/SettingService.AppCore/SettingService.AppCore.csproj" because it was not found.
#15 0.477 Skipping project "/src/SettingService.Infrastructure/SettingService.Infrastructure.csproj" because it was not found.
#15 0.478 Skipping project "/src/N8T.Core/N8T.Core.csproj" because it was not found.
#15 0.478 Skipping project "/src/N8T.Infrastructure.EfCore/N8T.Infrastructure.EfCore.csproj" because it was not found.
#15 0.478 Skipping project "/src/N8T.Infrastructure.OTel/N8T.Infrastructure.OTel.csproj" because it was not found.
#15 0.478 Skipping project "/src/N8T.Infrastructure/N8T.Infrastructure.csproj" because it was not found.
#15 0.478 Skipping project "/DataContracts/CoolStore.AppContracts/CoolStore.AppContracts.csproj" because it was not found.
#15 0.478 Skipping project "/DataContracts/CoolStore.IntegrationEvents/CoolStore.IntegrationEvents.csproj" because it was not found.
#15 0.478 Skipping project "/src/SettingService.AppCore/SettingService.AppCore.csproj" because it was not found.
#15 0.478 Skipping project "/src/SettingService.Infrastructure/SettingService.Infrastructure.csproj" because it was not found.
#15 0.590 All projects are up-to-date for restore.
#15 0.647 You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Core/N8T.Core.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure.EfCore/N8T.Infrastructure.EfCore.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure.OTel/N8T.Infrastructure.OTel.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure/N8T.Infrastructure.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../DataContracts/CoolStore.AppContracts/CoolStore.AppContracts.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../DataContracts/CoolStore.IntegrationEvents/CoolStore.IntegrationEvents.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../SettingService.AppCore/SettingService.AppCore.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 0.696 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../SettingService.Infrastructure/SettingService.Infrastructure.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.400 CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407
#15 1.407 Build FAILED.
#15 1.407
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Core/N8T.Core.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure.EfCore/N8T.Infrastructure.EfCore.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure.OTel/N8T.Infrastructure.OTel.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../../src/N8T.Infrastructure/N8T.Infrastructure.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../DataContracts/CoolStore.AppContracts/CoolStore.AppContracts.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../../DataContracts/CoolStore.IntegrationEvents/CoolStore.IntegrationEvents.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../SettingService.AppCore/SettingService.AppCore.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.407 /usr/share/dotnet/sdk/6.0.100-preview.5.21302.13/Microsoft.Common.CurrentVersion.targets(1966,5): warning : The referenced project '../SettingService.Infrastructure/SettingService.Infrastructure.csproj' does not exist. [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.408 CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/src/SettingService.Api/SettingService.Api.csproj]
#15 1.408 8 Warning(s)
#15 1.408 1 Error(s)
#15 1.408
#15 1.408 Time Elapsed 00:00:01.16


executor failed running [/bin/sh -c dotnet build "SettingService.Api.csproj" -c Release -o /app/build]: exit code: 1
ERROR: Service 'settingapp' failed to build : Build failed`

im new for dotnet and docker also looking for simple architecture project for long run. seem like its trying to find main method inside docker. any help would be greatly appreciated

Refactor to the truly minimal routing on each services

  1. To make it truly minimal, we need to refactor it to Map router on each service (that's mean we remove Swagger on each host, but I think after 6.0.100-preview.6.21308.9 SDK released, then we can bring back Swagger, see at https://github.com/halter73/swagger), and map it like https://github.com/halter73/MinimalWeather/blob/main/dotnet/MinimalWeather/Program.cs and https://github.com/dodyg/practical-aspnetcore/blob/net5.0/projects/net6/web-application-8/src/Program.cs, and https://github.com/425show/MinimalWeather/blob/main/Program.cs

  2. Refactor to 3 projects (one service - core + app and API only to make it is more simply), refactor App layer only contain interfaces + use cases + model only (and depends on Infrastructure layer)

  • CoreApp: Core + App layers
  • Infrastructure layer
  • API layer
  1. Then we write the aggregator like https://github.com/dotnet-architecture/eShopOnContainers/tree/dev/src/ApiGateways/Web.Bff.Shopping/aggregator, the reason is we need one centralize endpoints with swagger.json file, then we will use some kind of Swagger Client Generator like https://github.com/RicoSuter/NSwag/wiki/NSwagStudio to generate the HTTP client with all APIs we have. Then we can use it inside the Blazor app (we gonna refactor to remove the current web which is implemented using nextjs. But need to investigate more

i18n

Some of investigating besides the default options in Blazor: https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-6.0

Setup Dapr OAuth 2.0 with identityserver

Right now, we don't authentication the between Dapr sidecar and the application itself

Look at it:

// Dapr pubsub
app.MapPost("/CustomerCreated", (CustomerCreatedIntegrationEvent @event) =>
{
    Console.WriteLine($"I received the message with name={@event.GetType().FullName}");
    return Ok("Subscribed");
}).WithTopic("pubsub", "CustomerCreatedIntegrationEvent");

// Dapr cron job binding
app.MapPost("/ProductOutboxCron", async (ITxOutboxProcessor outboxProcessor) =>
    await outboxProcessor.HandleAsync(typeof(CoolStore.IntegrationEvents.Anchor)));

[Sample] Dashboard statistics

We might have some information such as:

  • Total products
  • Completed orders (we might add cart and order services then)
  • Unfinished orders (we might add cart and order services then)
  • New users or customers
  • Latest products, customers, orders
  • Sale on last 30 days

Look at the sample at

Extension.ApplySorting parameters are incorrect

    public static void ApplySorting(this IRootSpecification gridSpec,
        string sort,
        string orderByDescendingMethodName,
        string groupByMethodName)
    {

should be

    public static void ApplySorting(this IRootSpecification gridSpec,
        string sort,
        string orderByMethodName,
        string orderByDescendingMethodName)
    {

and very last "else" block should be...

            else
            {
                specificationType.GetMethod(
                        orderByMethodName,
                        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                    .Invoke(gridSpec, new object[] { propertyReturningExpression });
            }

awesome sample....thank you.

the branch inmem-outbox cannot run with tye

hi @thangchung, I would like to use this in our products.

But seem like the latest version of inmem-outbox branch cannot build and run with tye. I keep getting this error:

Loading Application Details...
Evaluating project failed with exit code 1
Drats! 'run' failed:
Evaluated project metadata file could not be found for service productapp

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.