Say you have a simple entity like so:
public class Todo
{
public Guid Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Say you have a simple entity like so:
public class Todo
{
public Guid Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
── Wolverine Handlers ────────────────────────────────────────────────────────────────────────────────────────────────── | |
Handler Discovery Rules | |
├── Assemblies | |
│ └── OrderSagaSample | |
├── Handler Type Rules | |
│ ├── Include: | |
│ │ ├── Name ends with 'Handler' | |
│ │ ├── Name ends with 'Consumer' | |
│ │ ├── Inherits from Wolverine.Saga |
── Wolverine Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | |
Service Name: DiagnosticsApp | |
├── Assemblies | |
│ ├── DiagnosticsApp (application) | |
│ └── DiagnosticsModule | |
├── Extensions | |
│ └── No applied extensions. | |
├── Serializers | |
│ └── ┌──────────────────┬──────────────────────┐ |
I’ve spent an inordinate amount of time the past half decade across multiple companies working with very large, long running enterprise systems. Especially in long running, constantly changing systems, you want the code to be easy to understand, relatively painless to extend or modify, and when advantageous, be simple to modernize with updated technology. Unfortunately, the systems I’ve worked on have consistently failed to satisfy these goals.
Ironically enough though, my judgment is that the code in these systems has been hard to understand, extend or change, and modernize because they had all adopted much of the very industry conventional wisdom about how to build large, maintainable systems.
In particular, I want to demonstrate and explain why I think that prescriptive, layered architectural styles like Clean or Onion Architecture can actually cause harm in larger systems. I also want us to train our sights on how teams attempt to hide the actual persistence technol
public Task<InvokeResult> InvokeAsync(MessageContext context, CancellationToken cancellation) | |
{ | |
var handlerAssemblies = context | |
.Runtime | |
.Options | |
.HandlerGraph | |
.Source | |
.Assemblies | |
.Select(x => x.FullName) | |
.Join(", "); |
public class DebitAccountHandler1928499868 : Wolverine.Runtime.Handlers.MessageHandler | |
{ | |
private readonly Wolverine.FluentValidation.IFailureAction<AppWithMiddleware.DebitAccount> _failureAction; | |
private readonly Wolverine.Marten.Publishing.OutboxedSessionFactory _outboxedSessionFactory; | |
private readonly FluentValidation.IValidator<AppWithMiddleware.DebitAccount> _validator; | |
public DebitAccountHandler1928499868(Wolverine.FluentValidation.IFailureAction<AppWithMiddleware.DebitAccount> failureAction, Wolverine.Marten.Publishing.OutboxedSessionFactory outboxedSessionFactory, FluentValidation.IValidator<AppWithMiddleware.DebitAccount> validator) | |
{ | |
_failureAction = failureAction; | |
_outboxedSessionFactory = outboxedSessionFactory; |
public class ShowHandler_CreateItemCommand : Jasper.Bus.Model.MessageHandler | |
{ | |
private readonly IDocumentStore _documentStore; | |
public ShowHandler_CreateItemCommand(IDocumentStore documentStore) | |
{ | |
_documentStore = documentStore; | |
} | |
using CommandLineRunner; | |
using Marten; | |
using Marten.AsyncDaemon.Testing; | |
using Marten.AsyncDaemon.Testing.TestingSupport; | |
using Marten.Events; | |
using Marten.Events.Aggregation; | |
using Marten.Internal.Storage; | |
using Marten.Storage; | |
using System; | |
using System.Linq; |
using Marten.AsyncDaemon.Testing; | |
using Marten.AsyncDaemon.Testing.TestingSupport; | |
using Marten.Internal; | |
using Marten.Internal.CompiledQueries; | |
using Marten.Internal.Storage; | |
using Marten.Linq; | |
using Marten.Linq.QueryHandlers; | |
using Marten.Schema; | |
using Marten.Schema.Arguments; | |
using Marten.Testing.Documents; |
using System; | |
using System.Collections.Generic; | |
using Baseline; | |
using Microsoft.Extensions.Logging; | |
using StoryTeller.Results; | |
using StoryTeller.Util; | |
namespace Jasper.TestSupport.Storyteller.Logging | |
{ | |
/// <summary> |