Wally.CleanArchitecture.Template
0.1.1513
See the version list below for details.
dotnet new install Wally.CleanArchitecture.Template::0.1.1513
Wally.CleanArchitecture.MicroService
[[TOC]]
ToDo
- Add
AggregateRoot
Shadow Properties
orAuditableEntity
abstract class for selectedAggregateRoot
andEntity
:
public DateTime Created { get; set; }
public string? CreatedBy { get; set; }
public DateTime? LastModified { get; set; }
public string? LastModifiedBy { get; set; }
ValueObject
abstract base:
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
}
- Create
DependencyInjection
class inInfrastructure
- Use Aspect Oriented Programming
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
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
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.2674 | 37 | 9/25/2024 |
1.3.2665 | 82 | 9/13/2024 |
1.3.2654 | 99 | 8/26/2024 |
1.3.2652 | 99 | 8/5/2024 |
1.3.2650 | 74 | 7/30/2024 |
1.3.2638 | 120 | 7/11/2024 |
1.3.2634 | 90 | 7/10/2024 |
1.3.2621 | 122 | 7/6/2024 |
1.3.2615 | 124 | 6/27/2024 |
1.3.2584 | 232 | 5/26/2024 |
1.3.2579 | 133 | 5/25/2024 |
1.3.2575 | 91 | 5/25/2024 |
1.3.2571 | 100 | 5/25/2024 |
1.3.2570 | 135 | 5/24/2024 |
1.3.2563 | 134 | 5/23/2024 |
1.3.2562 | 85 | 5/23/2024 |
1.3.2560 | 113 | 5/22/2024 |
1.3.2557 | 127 | 5/21/2024 |
1.3.2554 | 92 | 5/21/2024 |
1.3.2551 | 122 | 5/20/2024 |
1.3.2547 | 162 | 5/17/2024 |
1.3.2537 | 99 | 5/16/2024 |
1.3.2536 | 87 | 5/16/2024 |
1.3.2535 | 249 | 5/9/2024 |
1.3.2527 | 100 | 4/26/2024 |
1.3.2510 | 103 | 4/24/2024 |
1.3.2490 | 157 | 4/13/2024 |
1.3.2473 | 156 | 4/8/2024 |
1.3.2471 | 165 | 4/8/2024 |
1.3.2431 | 176 | 4/4/2024 |
1.3.2404 | 320 | 3/22/2024 |
1.3.2401 | 170 | 3/21/2024 |
1.3.2366 | 1,036 | 2/21/2024 |
1.3.2365 | 376 | 2/21/2024 |
1.3.2347 | 698 | 2/9/2024 |
1.3.2248 | 2,249 | 12/6/2023 |
1.3.2243 | 562 | 12/5/2023 |
1.3.2227 | 942 | 11/26/2023 |
1.3.2222 | 682 | 11/26/2023 |
1.3.2212 | 817 | 11/18/2023 |
1.3.2209 | 534 | 11/17/2023 |
1.3.2172 | 1,094 | 11/1/2023 |
1.3.2166 | 763 | 10/30/2023 |
1.3.2163 | 719 | 10/29/2023 |
1.3.2149 | 989 | 10/18/2023 |
1.3.2137 | 1,135 | 10/3/2023 |
1.3.2108 | 761 | 9/25/2023 |
1.3.2093 | 792 | 9/17/2023 |
1.3.2086 | 820 | 8/27/2023 |
1.3.2085 | 892 | 8/27/2023 |
1.3.2042 | 973 | 6/23/2023 |
1.3.2023 | 866 | 6/15/2023 |
1.3.1982 | 947 | 5/28/2023 |
1.3.1974 | 802 | 5/26/2023 |
1.3.1954 | 817 | 5/20/2023 |
1.3.1948 | 844 | 5/18/2023 |
1.3.1947 | 678 | 5/18/2023 |
1.3.1941 | 888 | 5/17/2023 |
1.3.1933 | 939 | 5/15/2023 |
1.3.1913 | 860 | 5/12/2023 |
1.3.1912 | 982 | 5/12/2023 |
1.3.1861 | 1,121 | 3/24/2023 |
1.3.1860 | 1,006 | 3/24/2023 |
1.3.1850 | 876 | 3/18/2023 |
1.3.1847 | 1,005 | 3/15/2023 |
1.3.1846 | 934 | 3/14/2023 |
1.3.1844 | 1,006 | 3/14/2023 |
1.3.1835 | 814 | 3/9/2023 |
1.3.1834 | 842 | 3/9/2023 |
1.3.1832 | 800 | 3/9/2023 |
1.3.1829 | 888 | 3/9/2023 |
1.3.1817 | 966 | 3/3/2023 |
1.2.1814 | 1,236 | 2/27/2023 |
1.2.1811 | 1,080 | 2/20/2023 |
1.2.1767 | 1,159 | 1/18/2023 |
1.2.1760 | 1,169 | 1/14/2023 |
1.2.1743 | 1,229 | 12/25/2022 |
1.2.1701 | 1,240 | 11/23/2022 |
1.2.1690 | 1,237 | 11/14/2022 |
1.2.1689 | 1,248 | 11/14/2022 |
1.2.1687 | 1,238 | 11/14/2022 |
1.2.1685 | 1,213 | 11/11/2022 |
1.2.8 | 1,228 | 11/1/2022 |
1.2.7 | 1,038 | 11/1/2022 |
1.2.6 | 1,263 | 11/1/2022 |
1.2.5 | 1,368 | 10/4/2022 |
1.2.4 | 1,365 | 9/9/2022 |
1.2.3 | 1,449 | 6/9/2022 |
1.2.2 | 1,256 | 6/9/2022 |
1.2.1 | 1,240 | 4/17/2022 |
1.2.0 | 1,443 | 4/17/2022 |
1.1.1553 | 1,376 | 6/10/2022 |
1.1.1516 | 1,238 | 4/17/2022 |
1.1.1515 | 1,447 | 4/17/2022 |
1.1.0 | 1,508 | 3/22/2022 |
0.1.1514 | 1,371 | 4/17/2022 |
0.1.1513 | 1,346 | 4/16/2022 |
0.1.1512 | 1,364 | 4/16/2022 |
0.1.1509 | 1,477 | 4/16/2022 |
0.1.1487 | 1,393 | 3/29/2022 |
0.1.1471 | 1,377 | 3/20/2022 |
0.1.1470 | 1,529 | 3/20/2022 |
0.1.1463 | 1,442 | 3/20/2022 |
0.1.1461 | 1,372 | 3/19/2022 |
0.1.1454 | 1,489 | 3/19/2022 |
0.1.1452 | 1,501 | 3/19/2022 |
0.1.1437 | 1,383 | 3/13/2022 |
0.1.1433 | 1,575 | 2/15/2022 |
0.1.1426 | 1,645 | 2/10/2022 |
0.1.1422 | 1,559 | 2/10/2022 |
0.1.1398 | 1,486 | 1/22/2022 |
0.1.1393 | 1,334 | 1/16/2022 |
0.1.1391 | 1,536 | 1/16/2022 |
0.1.1388 | 1,598 | 1/16/2022 |