Coder Social home page Coder Social logo

kgrzybek / modular-monolith-with-ddd Goto Github PK

View Code? Open in Web Editor NEW
10.3K 344.0 1.6K 8.23 MB

Full Modular Monolith application with Domain-Driven Design approach.

License: MIT License

C# 91.76% TSQL 7.12% Batchfile 0.14% Shell 0.54% Dockerfile 0.26% PowerShell 0.19%
ddd ddd-architecture cqrs architecture rest-api dotnet dotnetcore clean-architecture clean-code domain-driven-design

modular-monolith-with-ddd's People

Contributors

almaraubel avatar andreiganichev avatar bardr avatar bistok avatar coding4food avatar dependabot[bot] avatar dnahurnyi avatar dushanpantic avatar flowonyx avatar gerrited avatar gregoirewulliamoz avatar jeremymelton avatar jflaga avatar jin337359649 avatar kgrzybek avatar kmasalski avatar ledjon-behluli avatar lobosque avatar michal880 avatar neman avatar onuralp avatar piechpatrick avatar piotrwachulec avatar ramseyjacob avatar sroccaserra avatar vdasus avatar vikramvee avatar wialejo avatar xeinaemm 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  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

modular-monolith-with-ddd's Issues

Serialized messages contains BackingField with duplicated data

PROPERTY_k__BackingField values can be removed, they contains duplicated data

Serialized message example
{
"MeetingGroupProposalId": "674e153e-a1bf-40ce-aa2e-139bf37cd39a",
"Name": "test",
"Description": "test",
"LocationCity": "test",
"LocationCountryCode": "tst",
"ProposalUserId": "4065630e-4a4c-4f01-9142-0bacf6b8c64d",
"ProposalDate": "2020-03-11T01:08:06.1942544Z",
"Id": "d2757a04-e929-4ccf-a23b-360abe1f5b93",
"OccurredOn": "2020-03-11T01:08:15.1182219Z",
"<MeetingGroupProposalId>k__BackingField": "674e153e-a1bf-40ce-aa2e-139bf37cd39a",
"<Name>k__BackingField": "test",
"<Description>k__BackingField": "test",
"<LocationCity>k__BackingField": "test",
"<LocationCountryCode>k__BackingField": "tst",
"<ProposalUserId>k__BackingField": "4065630e-4a4c-4f01-9142-0bacf6b8c64d",
"<ProposalDate>k__BackingField": "2020-03-11T01:08:06.1942544Z"
}

Impossible to rollback business scenario in case of fail

It is needed to invent some way to rollback failed business scenarios.
For example scenario "create meeting group proposal" started at meetings module and finished at administration module. When meetings module created meeting group proposal then controller returned Ok result. But if creation of meeting group proposal in admin module failed then proposal will newer be accepted.
If creation of proposal failed in admin module then we need to send a message to messages module about it. After that meeting module can show to proposal creator information about fail (something like that "Something wrong with your proposal. Please try to resubmit it.")

Events in Entities, not in AggregateRoots

Hello Kamil,

I have a question regarding domain events. In some sources, which I used as my knowledge base (like this), there was information to store events in Aggreagates Roots. I see that in your code Entity contains such code and we add events in entities as well - MeetingAttendee.

What was the reason behind that decision? It is not that I am thinking that this is wrong - I am just curious. I thought we would like to allow and store changes only in AggregateRoot.

Integration tests not covered the whole business scenarios

Now "Create meeting group proposal" and "Accept meeting group proposal" business scenarios are broken. But both scenarios has integration tests.
I think a problem is in integration tests which covered only part of business scenario for current module, but not whole business scenario, which implemented by several modules.
For example, valid integration test for "Accept meeting group proposal" should execute AcceptMeetingGroupProposalCommand in admin module and wait for events in Meeting module (AcceptMeetingGroupProposalCommand, CreateNewMeetingGroupCommand, SendMeetingGroupCreatedEmailCommand). Only when all of these commands successfully executed by system then integration test is passed. This kind of tests will allow to find errors in business scenarios.

CompanyName.MyMeetings.Modules.Payments.IntegrationTests set to .NET Core 3.1 while rest of solution is on .NET Core 2.2

Hi,
Project CompanyName.MyMeetings.Modules.Payments.IntegrationTests as title syas, is set to .NET Cor 3.1 while rest of solution is on 2.2, so after setting it to 2.2 solution compiles successfully. Please change so that those of us on VS 2017 can still come along for the awesome ride. Thanks for this extremely detailed, extremely complete reference implementation! Great work and volumes to be learned here, so thank you very much for this project and all the hard work that went into it.

How many times should UnitOfWorkCommandHandler(WithResult)Decorator fire?

Hi. Great project! You have literally distilled Eric Evans (and others) blue book into a real (non-trivial and complete) project.

I am not sure if this is an issue but stepping through the code I noticed on (for example) CreateUserTests.CreateUser_Test.RegisterNewUserCommand, the decorator(s) fire more than once. Is this expected behavior? The reason I ask is that I haven't been able to follow those UoW "side effect" registrations in the MediatorModule(s) and ProcessingModule(s). I can't even reason why they are firing at all as most of the pre/post registrations I have seen documented elsewhere are different(I think).

Could I please ask for a small explanation of how you accomplished this? Thanks again.

UnitOfWorkCommandHandlerDecorator in UserAccess Module Doesn't Get Called.

Hello Kamil,

I thought I have figured the project architecture from end to end and decided to try it out on a side project. I am almost sure I followed your example thoroughly and didn't miss out anything. But when I tested it by trying out the RegisterUser endpoint, It returns 200 but the user isn't found at least in the database.
I tried to step through the process and realized that all through the process of the step-through, UnitOfWorkCommandHandlerDecorator and ValidationCommandHandlerDecorator were never called. When this line from CommandsExecutor.cs runs - return await mediator.Send(command); , Dispose() of SqlConnectionFactory.cs gets called next. I don't know why this happens.. At some point, the debug was stuck in between Quartz and SerilogLogProvider. I don't know what I'm missing, and I've been on this for days.
I was hoping you would point me to the right direction because my frustration is building up.
Please help.

database call in entity?

Hi,

Coming from a dynamic language developer background, I am little puzzled by this piece of code:

 var nextWaitlistMember = _waitlistMembers
                .Where(x => x.IsActive())
                .OrderBy(x => x.SignUpDate)
                .FirstOrDefault();

from

var nextWaitlistMember = _waitlistMembers

That looks like a db query in entity to me. Am I mistaken? I read that calling repository from Aggregate/Entity is not recommended in DDD.

Can someone shed some light?

thanks

James

MediatR Exceptions on IntegrationEvents following UserRegistration

System runs successfully on default database, but after a call to register a new user succeeds, the below exceptions keep on appearing in the console and logs - even after confirming the user registration the exceptions persist. Tried to debug, but the async nature, combined with Quartz, combined with MediatR is proving quite a challenge!

Also, where do I prevent Quartz startup for selected modules? In the Startup.cs code, I try to disable Administration and Payments modules, by not adding them to the Autofaq and also not calling their startup methods, but there is still output RE Quartz RE those modules in the logs...

This is a sample couple of successful requests, ending in a new user registration request, that seems to start out the trouble:

$ids_host = "http://localhost:5000"
$user = "[email protected]"
$pass = "testMemberPass"
$api_host = "https://localhost:5001"

$connect_token_endpoint = "$ids_host/connect/token"
$response = (curl.exe -d "grant_type=password&username=$user&password=$pass&client_id=ro.client&client_secret=secret" http://localhost:5000/connect/token    ) | Out-String
Write-Host "Response from token request: $response"
$json = $response | ConvertFrom-Json
$access_token = $($json.access_token)
Write-Host "Access token obtained: $access_token"

$access_header = "Authorization: Bearer $access_token"
$response = (curl.exe -X GET -H "$access_header" "$api_host/api/meetings/MeetingGroups") | Out-String
Write-Host "Response from hitting/api/meetings/meetingGroups : $response"

$json = @"
{
"login": \"newTestRegistrationmail.com\",
"email": \"newTestRegistrationmail.com\",
"password": \"12341234\",
"firstName": \"BobFirst\",
"lastName": \"BobLast\"
}
"@

Write-Host "The JSON to post is: $json"
$response = (curl.exe -X POST -H "Content-Type:application/json" -d $json "$api_host/userAccess/UserRegistrations/") | Out-String
Write-Host "Response from hitting /userAccess/UserRegistrations : $response"

And the error logs follow:

 
{"@t":"2020-03-13T07:26:28.1794400Z","@mt":"Logger configured","Module":"API"}
{"@t":"2020-03-13T07:26:48.3106056Z","@mt":"Quartz starting...","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5504597Z","@mt":"Quartz started.","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5598053Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Administration.IntegrationEvents.MeetingGroupProposals.MeetingGroupProposalAcceptedIntegrationEvent","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5641757Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Payments.IntegrationEvents.PaymentRegisteredIntegrationEvent","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5666956Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.NewUserRegisteredIntegrationEvent","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5911385Z","@mt":"Quartz starting...","Module":"Administration"}
{"@t":"2020-03-13T07:26:48.5968239Z","@mt":"Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.5991104Z","@mt":"Quartz Scheduler v.{0} created.","0":"3.0.7.0","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.6011513Z","@mt":"RAMJobStore initialized.","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.6025233Z","@mt":"Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'Administration' with instanceId 'NON_CLUSTERED'\n  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.\n  NOT STARTED.\n  Currently in standby mode.\n  Number of jobs executed: 0\n  Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.\n  Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.\n","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.6049065Z","@mt":"Scheduler Administration_$_NON_CLUSTERED started.","Module":"Meetings"}
{"@t":"2020-03-13T07:26:48.6068300Z","@mt":"Quartz started.","Module":"Administration"}
{"@t":"2020-03-13T07:26:48.6092923Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Meetings.IntegrationEvents.MeetingGroupProposedIntegrationEvent","Module":"Administration"}
{"@t":"2020-03-13T07:26:48.6138073Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.NewUserRegisteredIntegrationEvent","Module":"Administration"}
{"@t":"2020-03-13T07:26:48.6394202Z","@mt":"Quartz starting...","Module":"UserAccess"}
{"@t":"2020-03-13T07:26:48.6423385Z","@mt":"Quartz started.","Module":"UserAccess"}
{"@t":"2020-03-13T07:26:48.6451782Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Meetings.IntegrationEvents.MemberCreatedIntegrationEvent","Module":"UserAccess"}
{"@t":"2020-03-13T07:26:53.1627538Z","@mt":"Quartz starting...","Module":"Payments"}
{"@t":"2020-03-13T07:26:53.1654942Z","@mt":"Quartz started.","Module":"Payments"}
{"@t":"2020-03-13T07:26:53.1678650Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Administration.IntegrationEvents.MeetingGroupProposals.MeetingGroupProposalAcceptedIntegrationEvent","Module":"Payments"}
{"@t":"2020-03-13T07:26:53.1704615Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.NewUserRegisteredIntegrationEvent","Module":"Payments"}
{"@t":"2020-03-13T07:26:53.1743972Z","@mt":"Subscribe to {@IntegrationEvent}","IntegrationEvent":"CompanyName.MyMeetings.Modules.Meetings.IntegrationEvents.MeetingAttendeeAddedIntegrationEvent","Module":"Payments"}
{"@t":"2020-03-13T07:27:17.3741081Z","@mt":"Executing command {@Command}","Command":{"Login":"[email protected]","Password":"testMemberPass","Id":"c4d0109a-89e2-4197-abba-3c8ba69f291c","$type":"AuthenticateCommand"},"Module":"UserAccess","Context":"Command:c4d0109a-89e2-4197-abba-3c8ba69f291c","CorrelationId":"1ed7ce31-022e-4aba-8dda-f2f160fb9e35"}
{"@t":"2020-03-13T07:27:17.4964143Z","@mt":"Command processed successful, result {Result}","Result":"CompanyName.MyMeetings.Modules.UserAccess.Application.Authentication.Authenticate.AuthenticationResult","Module":"UserAccess","Context":"Command:c4d0109a-89e2-4197-abba-3c8ba69f291c","CorrelationId":"1ed7ce31-022e-4aba-8dda-f2f160fb9e35"}
{"@t":"2020-03-13T07:27:18.3040847Z","@mt":"Executing command {@Command}","Command":{"Login":"newTestRegistrationmail.com","Password":"12341234","Email":"newTestRegistrationmail.com","FirstName":"BobFirst","LastName":"BobLast","Id":"2c9dea24-802f-42be-a0f6-84ef5da06217","$type":"RegisterNewUserCommand"},"Module":"UserAccess","Context":"Command:2c9dea24-802f-42be-a0f6-84ef5da06217","CorrelationId":"482e5776-93cf-4ebd-b178-5e683edd2bd5"}
{"@t":"2020-03-13T07:27:18.6594828Z","@mt":"Command processed successful, result {Result}","Result":"744f3626-a192-4f1b-b43e-28e6ddba1c95","Module":"UserAccess","Context":"Command:2c9dea24-802f-42be-a0f6-84ef5da06217","CorrelationId":"482e5776-93cf-4ebd-b178-5e683edd2bd5"}
{"@t":"2020-03-13T07:27:30.0556784Z","@mt":"Publishing {Event}","Event":"CompanyName.MyMeetings.Modules.UserAccess.IntegrationEvents.NewUserRegisteredIntegrationEvent","Module":"UserAccess","Context":"OutboxMessage:16628ae3-d94f-4747-95a5-6b319088cdfc"}
{"@t":"2020-03-13T07:27:45.0161012Z","@mt":"Executing command {Command}","Command":"SendUserRegistrationConfirmationEmailCommand","Module":"UserAccess","Context":"Command:32656402-5dc3-4a27-abd6-4b1345567eb9"}
{"@t":"2020-03-13T07:27:45.0214720Z","@mt":"Email sent. From: {From}, To: {To}, Subject: {Subject}, Content: {Content}.","From":"[email protected]","To":"newTestRegistrationmail.com","Subject":"MyMeetings - Please confirm your registration","Content":"This should be link to confirmation page. For now, please execute HTTP request PATCH http://localhost:5000/userAccess/userRegistrations/744f3626-a192-4f1b-b43e-28e6ddba1c95/confirm","Module":"UserAccess","Context":"Command:32656402-5dc3-4a27-abd6-4b1345567eb9"}
{"@t":"2020-03-13T07:27:45.3532836Z","@mt":"Command {Command} processed successful","Command":"SendUserRegistrationConfirmationEmailCommand","Module":"UserAccess","Context":"Command:32656402-5dc3-4a27-abd6-4b1345567eb9"}
{"@t":"2020-03-13T07:28:00.2175794Z","@mt":"Job DEFAULT.cecfc45d-76c7-42cb-99a3-8c947b3076e7 threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 41\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 30\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 34\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:00.2171954Z","@mt":"Executing command {Command}","Command":"CreateMemberCommand","Module":"Meetings","Context":"Command:b021c919-53a7-4c0b-a4d3-ff92ed7d566b"}
{"@t":"2020-03-13T07:28:00.2700795Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:00.3539200Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an exception.","@l":"Error","@x":"Quartz.SchedulerException: Job threw an unhandled exception. ---> System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193\r\n   --- End of inner exception stack trace --- [See nested exception: System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193]","Module":"Meetings"}
{"@t":"2020-03-13T07:28:00.3664475Z","@mt":"Command {Command} processed successful","Command":"CreateMemberCommand","Module":"Meetings","Context":"Command:b021c919-53a7-4c0b-a4d3-ff92ed7d566b"}
{"@t":"2020-03-13T07:28:15.1796544Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:15.2023679Z","@mt":"Job DEFAULT.cecfc45d-76c7-42cb-99a3-8c947b3076e7 threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 41\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 30\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 34\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:15.2203049Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an exception.","@l":"Error","@x":"Quartz.SchedulerException: Job threw an unhandled exception. ---> System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193\r\n   --- End of inner exception stack trace --- [See nested exception: System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193]","Module":"Meetings"}
{"@t":"2020-03-13T07:28:30.2367342Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:30.2369860Z","@mt":"Job DEFAULT.cecfc45d-76c7-42cb-99a3-8c947b3076e7 threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 41\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 30\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 34\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:30.2549945Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an exception.","@l":"Error","@x":"Quartz.SchedulerException: Job threw an unhandled exception. ---> System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193\r\n   --- End of inner exception stack trace --- [See nested exception: System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193]","Module":"Meetings"}
{"@t":"2020-03-13T07:28:45.1788915Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:45.2287210Z","@mt":"Job DEFAULT.cecfc45d-76c7-42cb-99a3-8c947b3076e7 threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 41\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 30\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 34\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:28:45.2437731Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an exception.","@l":"Error","@x":"Quartz.SchedulerException: Job threw an unhandled exception. ---> System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193\r\n   --- End of inner exception stack trace --- [See nested exception: System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193]","Module":"Meetings"}
{"@t":"2020-03-13T07:29:00.1883384Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:29:00.2520340Z","@mt":"Job DEFAULT.cecfc45d-76c7-42cb-99a3-8c947b3076e7 threw an unhandled Exception: ","@l":"Error","@x":"System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 41\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 30\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 34\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Payments.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Payments\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193","Module":"Payments"}
{"@t":"2020-03-13T07:29:00.2684258Z","@mt":"Job DEFAULT.add2723c-4a84-423f-8a18-4573c5db8e1a threw an exception.","@l":"Error","@x":"Quartz.SchedulerException: Job threw an unhandled exception. ---> System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193\r\n   --- End of inner exception stack trace --- [See nested exception: System.ArgumentNullException: Value cannot be null.\r\nParameter name: request\r\n   at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsCommandHandler.Handle(ProcessInternalCommandsCommand command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsCommandHandler.cs:line 43\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.UnitOfWorkCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\UnitOfWorkCommandHandlerDecorator.cs:line 32\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.LoggingCommandHandlerDecorator`1.Handle(T command, CancellationToken cancellationToken) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\LoggingCommandHandlerDecorator.cs:line 35\r\n   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.CommandsExecutor.Execute(ICommand command) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\CommandsExecutor.cs:line 15\r\n   at CompanyName.MyMeetings.Modules.Administration.Infrastructure.Configuration.Processing.InternalCommands.ProcessInternalCommandsJob.Execute(IJobExecutionContext context) in C:\\repos\\API-Services\\samples\\modular-monolith-with-ddd\\src\\Modules\\Administration\\Infrastructure\\Configuration\\Processing\\InternalCommands\\ProcessInternalCommandsJob.cs:line 11\r\n   at Quartz.Core.JobRunShell.Run(CancellationToken cancellationToken) in C:\\projects\\quartznet\\src\\Quartz\\Core\\JobRunShell.cs:line 193]","Module":"Meetings"}

Unable to find all messages for business scenario

Now CorrelationId used only for logging purposes. It is good idea for logging. But now we are unable to find all messages for some business scenario (for example, accept meeting group proposal). Messages stored in InternalCommands in each module. Now we have 4 modules and we have to union results of select query for 4 tables to receive list of messages for business scenario. It is better to create single table as a storage of messages (or commands).
Also it is possible to create additional column CorrelationId to group commands by business scenario

Improve Problem Details response

Change Problem Details according to @sm-g comment:

@kgrzybek I'm reading your https://www.kamilgrzybek.com/design/rest-api-data-validation/ and found that title in problem details reponse which your code generates is different from case to case, which violates the RFC7807 (https://tools.ietf.org/html/rfc7807#section-3.1). Title is just function of type for humans. Better place for messages from validators is details or even custom extensions (see examples in https://tools.ietf.org/html/rfc7807#section-3)

Originally posted by @sm-g in #3 (comment)

Accept of MeetingGroupProposal not works

When meeting group proposal accepted then created MeetingGroup with MeetingGroupMember where MemberId is MeetingGroup creator Id. But not created new record in table meetings.Members.
And SendMeetingGroupCreatedEmailCommandHandler failed because it tried to find member by creator Id in Members but not MeetingGroupMembers table.
And we have the same problem with SendMeetingGroupCreatedEmailCommandHandler - it failed every time it executed in infinite loop.
So I think it is possible to avoid the infinite loop using try/catch and Attempts field for internal command. Also it is possible to add relations between tables in database, so it will be impossible to insert new row in table MeetingGroupMembers before inserting corresponding row in table Members

BTW, why do you decide to use Guid as a primary key type instead of int?

Creating of MeetingGroupProposal not works

Administration module contains command RequestMeetingGroupProposalVerificationCommand which inherits InternalCommandBase and implements ICommand

But ProcessInternalCommandsCommandHandler converts deserialized command to ICommand, so commandToProcess is null. RequestMeetingGroupProposalVerificationCommand deserialized again and again in infinite loop because it not processed and ProcessedDate is null.
I think it is possible to create additional field Attempts at InternalCommand, wrap execution of command in try/catch and increase attempts in catch block. If Attempts exceed some limit (for example, 3 attempts) then we will select it for execution next time.

Also we can replace code JsonConvert.DeserializeObject(internalCommand.Data, type) as ICommand by (ICommand)JsonConvert.DeserializeObject(internalCommand.Data, type). In this case we will receive not NRE but more informative InvalidCastException.

And we can create a naming convention for all internal commands and create an architecture test which check this convention. For example all classes which name ends with InternalCommand must implement interface ICommand

How to have the authentication service on HTTPS instead of HTTP?

By default, the IDS4 authentication service runs over HTTP: how can we have that over HTTPS please? Since a user has to obtain the JWT token through the IDS4 service, if it runs on HTTP it means that the user will be sending the username and password over HTTP as well as receiving the JWT token over unencrypted HTTP. Is there a simple way to enable HTTPS here. As for the actual API, that is nicely by default HTTPS, so no issues here! Thanks in advance.

[Improvement] Add authentication/login to swagger UI

Hi Kamil, great project/initiative.
I'd like to play with its public API using swagger, However, it's missing the login/authentication functionality from it. If you could add it it would be great.
Thanks,
AndrΓ©

Application layer design

Hi @kgrzybek , first of all, thanks for your work!

I have been going thru the codebase and I have noticed an approach which slightly differs from my own, thus I wanted to ask some questions to better understand the drivers & reasoning behind it.

In the application layer, there is a lot of dependencies, which I usually delegate to infrastructure layer.
For example - event bus related stuff, DI modules, logging, schedulers - basically everything that is not Command or CommandHandler. Sometimes it happens, that in CommandHandler you need something more. In that case, I usually go for the interface in the application layer implemented in the infrastructure layer.

Speaking of modules, I noticed that in each module there are usually couple of autofac modules, e.g. MediatorModule, QuartzModule, DataAccessModule. What is the reason of that?

Each .csproj has a reference to Microsoft.NETCore.App - would you consider switching that to .netstandard? I reference the platform at the top-level such as API (CompanyName.MyMeetings.API in this case). Benefit of that is that it allows my to easily switch the platform and has much less coupling for my application.

I want to make it clear that I'm not trying to say the only valid way to do something is "my & only righteous way". I'm more of looking for exchange of thoughts and maybe an improvement in common understanding.

If you think that something can be extracted to separate issue, please do so, I didn't want to spam you πŸ˜„

Reports design consideriation

Application is modular. Each module have own set of tables.

How do you see reporting module? All data duplicated into that module for reporting reasons?

Error Handling

Excuse the ignorance and unless I missed it in the docs, how does this system handle errors, particularly on the command side? It looks like most of controllers return ok();

Is this something to come?

Infrastructure Service - Design

I have another design question πŸ˜ƒ

I wanted to understand how you would integrate a service such as AWS S3 into this domain. Let's say that we allow users to upload files/images to meetings for people to access. This could be images of meeting venue so people could see it before hand. (Business Rule) Meetings are allowed to have a max of 10 images. (I could give more examples but I think this works.)

The FileService would have the following functionality:

  • creating signed urls
  • renaming files
  • moving files
  • deleting files
  • getting file metadata (maybe we could use this info to validate the upload images?)

I'm thinking you could abstract the AWS S3 functionality into a FileService.

MyMeetings.BuildingBlocks.Infrastructure
----------------------------------------------FilesService/
----------------------------------------------------------- IFileService
----------------------------------------------------------- FileService (FileConfiguration)
----------------------------------------------------------- FileConfiguration (bucketName, region, keys)

MyMeetings.Meetings.Module.Infrastructure
-------------------------------------------------FileService/
-------------------------------------------------------------FileModule (FileService, FileConfiguration)

Then within the Meetings.Module.Application we would use this service and update the appropriate aggregates.

I just wanted to thank you again for such an amazing repo. I've been learning so much.

Duplicated items on *.Modules.Application

Hi Kamil,

I see that there are some items located in each module and completely the same except their namespaces. For instance, CommandBase, ICommand, IQuery etc.

I would like to ask about this approach. What could be wrong if we put them in a common library (for instance "CompanyName.MyMeetings.Modules.Common.Application") to avoid code duplication?

Thank you.

No Migrations?

I find this architecture very nice, especially because of its complexity and the modular approach you adopted. However, I noticed that there are no migrations that creates the DB models from the domain. I have read somewhere that code first migrations bring a lot of issues in enterprise level development especially in production. I feel it's why you probably didn't use it.
I see you have a database project. Does this mean I'll have to create the database and still code the domain models too? Please I need you to throw more light on this.

Event Storming Policies

Hey!

I just wanted to say thanks for such a great project. It's really helped me clear up questions that I've had around DDD. I just have one question regarding event storming and policies. Usually you would have the following flow in an event storming scenario.

event-storming

I'm trying to wrap my head around Policies and where to place the logic.

When a domain event is fired you would have a Notification to wrap that event and a NotificationHandler in the Application layer to handle the event. Where would you place the policy logic? In the NotificationHandler?

Can we be best friends?

I want you know how much this has helped tie up several loose ends in my understanding of concepts like Entities, ValueObjects, CQRS, Modular Monolith, while also pulling together technologies like EF Core, Mediator, ASP.NET Core, Serilog, Quartz.NET, all into one project.

Thank you for this and I look forward to learning more from you and from this project in the future!

Help needed for improvement

Hi @kgrzybek ,
I am trying to add Automapper to map the request to command, which makes the code look much cleaner. But on every command you have a constructor that set's values. Would it be fine if i change it like this

image

So the the above helps in achieving this.

var proposeMeetingCommand = new ProposeMeetingGroupCommand();
_mapper.Map(request, proposeMeetingCommand);
await _meetingsModule.ExecuteCommandAsync(proposeMeetingCommand);

Please let me know your thoughts/ suggestions

Never considered a third party lib for outbox implementation?

You rely on some deliberately selected 3rd party libs but the outbox implementation is part of your own code base.
I have played with https://github.com/dotnetcore/CAP and it feels very much ok.
I understand that in the monolith world there is less need for a queuing infrastructure but cap supports also in memory transports. Nonetheless, even in a monolith there is need for retries (e.g. when the integration event handler throws) which can be quite configured quite easy in Cap.

Rename MeetingsAutofacModule.cs to PaymentsAutofacModule.cs

Hi,

It looks like there is a naming mistake with the file
modular-monolith-with-ddd/src/API/CompanyName.MyMeetings.API/Modules/Payments/MeetingsAutofacModule.cs.
I believe it should be PaymentsAutofacModule.cs.

If I'm wrong, could you elaborate on why you named it this way?

Best regards
Dominique

Architecture Decision Records?

I wonder whether it would be good to add Architecture Decision Records (ADRs) https://adr.github.io/ into this project? They might be a little contrived, but it would good to see them added to this project in its role as an exemplar.

Example of Domain Service

Looking at source code I could not found example of DomainService, i.e. for some volatile policy, or use case, involving several aggregates.

I am looking for how your IBusinessRule pattern should be implemented there. In my experience DomainService also could generate BusinessRules-relates exceptions.

Visual Studio users must use 2019

Thanks for the great example.

This is not an issue with the project itself, but I just wanted to share to Visual Studio users that 2019 is required. .Net Core 3.1 is not supported in previous versions. Maybe this note will prevent a little grief for someone else.

I was stuck on this way to too long, before noticing VS 2017 warning me that ".NET Core 3.1 is not supported in this version".

This presents as "User context not available" during authorization.

After Migrating in to .Net 3.1 Failing to hit LoggingCommandHandlerDecorator

Changed Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder() and changed the Startup class to

from:private IServiceProvider CreateAutofacServiceProvider(IServiceCollection services)
to: public void ConfigureServices(IServiceCollection services)

and removed CreateAutofacServiceProvider(services)
instead of that i used.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)

to initialize the module from above configure method.
public void ConfigureContainer(ContainerBuilder containerBuilder)
To register Autofacmodules.

IComponentRegister doesnt contains GenericDecorator e.g. LoggingDecorator ,ValidationDecorator...

What could be the issue.

Unable to scale.

Hello from Belarus! First of all thank you for you project and I also want to be friends with you!)

I have one question. In your blog you say, that one of disadvantages of monolith is that during horizontal scaling we need to deploy whole system, but monolith could be deployed in general. But if we look at your current implementation it could not be scaled at all because of processors (ProcessOutboxJob for example). Am I right?

If I am right, do you have some proposition, how scaling could be achieved?

For example, we can move ProcessOutboxJob to separate process. It can poll database and read outbox as it works now. Then we can scale rest of app. But when our ProcessOutboxJob will publish events to some bus (RabbitMQ) and have multiple instances of apps, that consume this messages, we will lose message ordering, which is critical. So, this is bad solution. And, to be honest, I do not know what to do. I really have no idea how to scale apps, that use Outbox pattern. Or read sides of EventSourced systems, for example

Module project splitup

I like this modularization, but I don't think I would use it as a good example.
What would change my mind would be to skip the project split up within the module.
And not divide the code into technical terms such as infrastructure for example.
I believe the things in infrastructure can get more logical names.

Infrastructure Module and DRY

A lot of code on each module Infrastructure project is repeated. For example OutboxMessageDto.cs is exactly the same across all projects.
I understand the fact that this level of decoupling comes with the downside of repeating some code. But since there is a BuildingBlocks project anyway, why did you decide not to keep most of this repeating code there?

Immediate domain event notifications

Hello. I have one design question and proposition.

May be my proposition is little bit naive, but anyway. In current implementation we have background processes for outbox messages, inbox messages and internal commands. As far, as I can see, each of them polls database each 2 seconds.

Let us imagine, that we need update aggregate A using domain even DE_1 and then update aggregate B in another transaction (all this actions are performed in same module M1). So, according current implementation, we need to create domain event notification, based on DE_1 (let us call it DEN_1), then we need to register domain event notification handler (for creating internal command, which will update aggregate B). So, if we are unlucky, we can update aggregate A, save DEN_1, which will be processed only through 2 seconds by ProcessOutboxJob. Then it is possible, that our internal command also would be processed only through 2 seconds . As you can see, in unlucky scenario we can start processing aggregate B only through 4 seconds after finishing update aggregate A . In many cases this is ok, but I can imagine a lot of situations, when we need update aggregate B as quick as possible. So I have several propositions how to do it:

  1. We can have one more type of DomainEventNotification. Let us call it UrgentDomainEventNotification. If some domain event has at least one urgent domain event notification, we can try to run outbox processor right after committing transaction (but then we need some locks on outbox table). Or maybe our UnitOfWork should try to dispatch only DE_1 related domain event notifications right after committing transaction. In both cases, in the handler of this UrgentDomainEventNotification we should create new internal command and try to execute it immediately.

  2. We can have special type of commands. For this commands we do not apply UnitOfWorkCommandHandlerDecorator and call _unitOfWork.CommitAsync manually in command handler for different aggregates.

So if we implement something, we will have possibilities:

  1. Update several aggregates in same transaction (aggregate B reacts on some domain event from aggregate A)
  2. Perform offline update of aggregate B in another transaction (like you have it now).
  3. Perform urgent update of aggregate B in another transaction (my proposition)

Even now I can see, how my propositions could be improved. I want only give you general idea. Anyway, i want to say thank you again. You project is really cool

Consider behaviors instead of decorators for cross-cutting concerns

MediatR offers first class support for extending command processing pipeline with own behaviors. It feels more natural to implement cross-cutting this way (in oppose to decorators).

https://github.com/jbogard/MediatR/wiki/Behaviors

If I'm not missing something then whole pipeline (logging, validation, UoW) can be migrated to behaviors. At the same time we can avoid some DI shenanigans that can be unreliable in other containers.

Steps to Obtaining OAuth 2.0 Token

I'm fairly new to token tech but I have tried to use Postman to send a POST with simply query strings to get an OAuth2 token (below) using the method shown here.

I'm seeing this error in postman console log:

Error: Could not complete OAuth 2.0 token request: {"":""}

I think I'm missing something - but is there an endpoint for doing Auth?
I have used /oauth/token but probably not correct but best guess

https://localhost:5000/oauth/token/?grant_type=password&[email protected]&password=testMemberPass&client_id=ro.client&client_secret=secret

I'm happy to help write up/clarify some baby steps if needed :-)

Application Insights integration

Hey,
Good job with the project, it is always nice to see another DDD/CQRS open source projects.
Have ever you thought about integration with Application Insights? It could be good for performing/logging/diagnostics/alerting etc.

It has worked well in company project, especially that AI has possibility to inject into pipeline and add custom headers like CorrelationID

Discussion: dapr, WASM Blazor and Orchard Core Framework

Hi just to hear your thoughts on these two/three

Isn't dapr a perfect fit for this project?

What about WASM/Blazor running the business logic on the client? I haven't had time to play with it but before I commit to it I need to know how you would architect it running the business logic on the clients.

Maybe you consider that out-of scope because you run all through an API?

And finally since I started talking about brand new tech I want to point out Orchard Core Framework

"An application framework for building modular, multi-tenant applications on ASP.NET Core"

if that is something that could be of use in this project or to somebody else reading this.

Alternative way of initializing aggregate roots in a repository?

Hi Kamil, thank you for this awesome resource.
I'm using it as a reference for a project not developed in C# and I'm struggling with the initialization of already persisted entities.
The way I'm understanding your codebase is that the EF Framework initializes the entities by using the default private constructor and then sets the properties through reflection.

Another way of doing this would be obviously for the repository to use all the public methods to initialize the entity, but that would require all validations to be run on every database retrieval and also the repositories would become very complex, by having to call the correct entity methods in the correct order, depending on the persisted object state.
But on the other side if your persisted data changes for some reason, you could end up with an entity in an invalid business state, couldn't you?
One could add a method to the entity e.g. InitializeWithoutValidation(fullData) but that's also not nice. Are you aware of another agreed way of doing this which would not depend on language features?

--
Also unrelated question:
I think your IntegrationEventGenericHandler.cs should not use a simple INSERT INTO since InboxMessages.Id is a UNIQUEIDENTIFIER which would mean you would get an exception the second time the same event is sent through the event bus (e.g. when ProcessOutboxCommand fails to update the event state as processed) which would then again prevent outboxCommand from marking the event as sent therefore resulting in a communication deadlock?

Why *Request classes are in modules?

Hi Kamil,

Thank you for your work. It's a food for thinking :).

I'm analyzing it once again and I would be thankful for explaining one thing - described shortly in subject.

Why *Request classes are in module and not by the controllers?
E.g. ChangeMeetingMainAttributesRequest, AddMeetingAttendeeCommandRequest, etc.

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.