Wally.CleanArchitecture.Template 0.1.1487

There is a newer version of this package available.
See the version list below for details.
dotnet new install Wally.CleanArchitecture.Template::0.1.1487
This package contains a .NET Template Package you can call from the shell/command line.

Wally.CleanArchitecture

[[TOC]]

ToDo

  1. Add AggregateRoot Shadow Properties or AuditableEntity abstract class for selected AggregateRoot and Entity:
public DateTime Created { get; set; }

public string? CreatedBy { get; set; }

public DateTime? LastModified { get; set; }

public string? LastModifiedBy { get; set; }
  1. ValueObject abstract base:

MSDN

public abstract class ValueObject
{
    protected static bool EqualOperator(ValueObject left, ValueObject right)
    {
        if (ReferenceEquals(left, null) ^ ReferenceEquals(right, null))
        {
            return false;
        }
        return ReferenceEquals(left, null) || left.Equals(right);
    }

    protected static bool NotEqualOperator(ValueObject left, ValueObject right)
    {
        return !(EqualOperator(left, right));
    }

    protected abstract IEnumerable<object> GetEqualityComponents();

    public override bool Equals(object obj)
    {
        if (obj == null || obj.GetType() != GetType())
        {
            return false;
        }

        var other = (ValueObject)obj;

        return this.GetEqualityComponents().SequenceEqual(other.GetEqualityComponents());
    }

    public override int GetHashCode()
    {
        return GetEqualityComponents()
            .Select(x => x != null ? x.GetHashCode() : 0)
            .Aggregate((x, y) => x ^ y);
    }
    // Other utility methods
}
  1. Create DependencyInjection class in Infrastructure

GitHub

  1. Use Aspect Oriented Programming

YouTube

Components

Swagger

UI: https://localhost:7197/swagger/index.html

Serilog

serilog.json

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.ApplicationInsights"
    ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Debug"
      },
      {
        "Name": "Console",
        "Args": {
          "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
          "outputTemplate": "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Properties:j}{NewLine}{Exception}{NewLine}"
        }
      },
      {
        "Name": "ApplicationInsights",
        "Args": {
          "instrumentationKey": "---",
          "restrictedToMinimumLevel": "Information",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
        }
      },
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "---",
          "tableName": "Log",
          "columnOptionsSection": {
            "addStandardColumns": [ "LogEvent" ],
            "removeStandardColumns": [ "Properties" ]
          }
        }
      }
    ],
    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      "WithThreadId"
    ],
    "Properties": {
      "Application": "Wally.CleanArchitecture"
    }
  }
}

Health Checks

AppVer: https://localhost:7197 Health: https://localhost:7197/healthchecks

UI: https://localhost:7197/healthchecks-ui UI cfg: https://localhost:7197/healthchecks-api/ui-settings

API: https://localhost:7197/healthchecks-api

Webhooks: https://localhost:7197/healthchecks-webhooks

website

appsettings.json

...
  "HealthChecks-UI": {
    "DisableMigrations": true,
    "HealthChecks": [
      {
        "Name": "Poll Manager",
        "Uri": "/healthChecks"
      }
    ],
    "Webhooks": [
      {
        "Name": "",
        "Uri": "",
        "Payload": "",
        "RestoredPayload": ""
      }
    ],
    "EvaluationTimeOnSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60,
    "MaximumExecutionHistoriesPerEndpoint": 15,
    "HealthCheckDatabaseConnectionString": "Data Source=healthChecks"
  }
...

Known Issues:

Mapster

Known Issuees:

System.MissingMethodException: Constructor on type 'Mapster.EFCore.MapsterAsyncEnumerable`1[[Wally.CleanArchitecture.Contracts.Responses.Users.GetUserResponse, Wally.CleanArchitecture.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' not found.
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, Object[] args)
   at Mapster.EFCore.MapsterQueryableProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, Expression expression, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.SingleAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at Wally.CleanArchitecture.Persistence.Repository`1.GetAsync[TResult](Guid id, CancellationToken cancellationToken) in C:\repo\wally\wally.CleanArchitecture\src\Wally.CleanArchitecture.Persistence\Repository.cs:line 0
   at Wally.CleanArchitecture.Application.Users.Queries.GetUserQueryHandler.HandleAsync(GetUserQuery query, CancellationToken cancellationToken) in C:\repo\wally\wally.CleanArchitecture\src\Wally.CleanArchitecture.Application\Users\Queries\GetUserQueryHandler.cs:line 19
   at Wally.CleanArchitecture.Application.Abstractions.QueryHandler`2.Handle(TQuery query, CancellationToken cancellationToken) in C:\repo\wally\wally.CleanArchitecture\src\Wally.CleanArchitecture.Application\Abstractions\QueryHandler.cs:line 16
   at MediatR.Internal.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_0.<Handle>g__Handler|0()
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)

AutoMapper

WebSite

Tests

curl -X GET "https://localhost:7197/Users/3fa85f64-5717-4562-b3fc-2c963f66afa6" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"
curl -X GET "https://localhost:7197/Users" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"
curl -X GET "https://localhost:7197/Users?$orderby=Id&$top=1" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"
curl -X GET "https://localhost:7197/Users?$count=true&$orderby=Id&$top=0" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"
curl -X GET "https://localhost:7197/Users?$count=true&$orderby=Id&$skip=2&$top=2" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"

{
	"items":[
		{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa8","name":"testDbData3"}
	],
	"pageInfo":{
		"index":1,
		"size":2,
		"totalItems":3
	}
}

curl -X GET "https://localhost:7197/Users?$orderby=Name%20desc&$top=3" -H "accept: application/json;odata.metadata=minimal;odata.streaming=true"

{
	"items":[
		{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa8","name":"testDbData3"},
		{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa7","name":"testDbData2"},
		{"id":"3fa85f64-5717-4562-b3fc-2c963f66afa6","name":"testDbData1"}
	],
	"pageInfo":{
		"index":0,
		"size":3,
		"totalItems":3
	}
}
  • net6.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.2527 62 4/26/2024
1.3.2510 77 4/24/2024
1.3.2490 125 4/13/2024
1.3.2473 130 4/8/2024
1.3.2471 142 4/8/2024
1.3.2431 152 4/4/2024
1.3.2404 293 3/22/2024
1.3.2401 145 3/21/2024
1.3.2366 1,008 2/21/2024
1.3.2365 356 2/21/2024
1.3.2347 670 2/9/2024
1.3.2248 2,228 12/6/2023
1.3.2243 539 12/5/2023
1.3.2227 917 11/26/2023
1.3.2222 664 11/26/2023
1.3.2212 800 11/18/2023
1.3.2209 512 11/17/2023
1.3.2172 1,070 11/1/2023
1.3.2166 740 10/30/2023
1.3.2163 702 10/29/2023
1.3.2149 965 10/18/2023
1.3.2137 1,111 10/3/2023
1.3.2108 736 9/25/2023
1.3.2093 773 9/17/2023
1.3.2086 799 8/27/2023
1.3.2085 870 8/27/2023
1.3.2042 964 6/23/2023
1.3.2023 848 6/15/2023
1.3.1982 930 5/28/2023
1.3.1974 787 5/26/2023
1.3.1954 802 5/20/2023
1.3.1948 838 5/18/2023
1.3.1947 663 5/18/2023
1.3.1941 873 5/17/2023
1.3.1933 923 5/15/2023
1.3.1913 845 5/12/2023
1.3.1912 960 5/12/2023
1.3.1861 1,109 3/24/2023
1.3.1860 984 3/24/2023
1.3.1850 859 3/18/2023
1.3.1847 989 3/15/2023
1.3.1846 918 3/14/2023
1.3.1844 1,001 3/14/2023
1.3.1835 799 3/9/2023
1.3.1834 829 3/9/2023
1.3.1832 780 3/9/2023
1.3.1829 871 3/9/2023
1.3.1817 942 3/3/2023
1.2.1814 1,218 2/27/2023
1.2.1811 1,064 2/20/2023
1.2.1767 1,136 1/18/2023
1.2.1760 1,163 1/14/2023
1.2.1743 1,204 12/25/2022
1.2.1701 1,216 11/23/2022
1.2.1690 1,223 11/14/2022
1.2.1689 1,224 11/14/2022
1.2.1687 1,214 11/14/2022
1.2.1685 1,190 11/11/2022
1.2.8 1,208 11/1/2022
1.2.7 1,020 11/1/2022
1.2.6 1,247 11/1/2022
1.2.5 1,357 10/4/2022
1.2.4 1,339 9/9/2022
1.2.3 1,430 6/9/2022
1.2.2 1,230 6/9/2022
1.2.1 1,229 4/17/2022
1.2.0 1,416 4/17/2022
1.1.1553 1,361 6/10/2022
1.1.1516 1,218 4/17/2022
1.1.1515 1,426 4/17/2022
1.1.0 1,486 3/22/2022
0.1.1514 1,350 4/17/2022
0.1.1513 1,327 4/16/2022
0.1.1512 1,338 4/16/2022
0.1.1509 1,450 4/16/2022
0.1.1487 1,374 3/29/2022
0.1.1471 1,361 3/20/2022
0.1.1470 1,499 3/20/2022
0.1.1463 1,417 3/20/2022
0.1.1461 1,352 3/19/2022
0.1.1454 1,470 3/19/2022
0.1.1452 1,492 3/19/2022
0.1.1437 1,364 3/13/2022
0.1.1433 1,551 2/15/2022
0.1.1426 1,620 2/10/2022
0.1.1422 1,536 2/10/2022
0.1.1398 1,468 1/22/2022
0.1.1393 1,317 1/16/2022
0.1.1391 1,513 1/16/2022
0.1.1388 1,588 1/16/2022