Skip to content

Instantly share code, notes, and snippets.

View jeremydmiller's full-sized avatar

Jeremy D. Miller jeremydmiller

View GitHub Profile
── 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
│ └── ┌──────────────────┬──────────────────────┐
@jeremydmiller
jeremydmiller / abstract.md
Last active February 1, 2023 04:39
A Contrarian Take on Architecture

A Contrarian Take on Architecture

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;
}
@jeremydmiller
jeremydmiller / Events.cs
Created August 4, 2021 14:38
Marten generated code for event storage and projections
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;
@jeremydmiller
jeremydmiller / DocumentStorage.cs
Created August 4, 2021 14:35
Generated code for Marten Document Storage
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;
@jeremydmiller
jeremydmiller / StorytellerAspNetCoreLogger
Created March 11, 2019 18:40
A strategy to plug ASP.Net Core logging into Storyteller test results
using System;
using System.Collections.Generic;
using Baseline;
using Microsoft.Extensions.Logging;
using StoryTeller.Results;
using StoryTeller.Util;
namespace Jasper.TestSupport.Storyteller.Logging
{
/// <summary>
=============================================================================================================================================================
ServiceType Namespace Lifecycle Description Name
-------------------------------------------------------------------------------------------------------------------------------------------------------------
IContainer Lamar Scoped Current IContainer IContainer
-------------------------------------------------------------------------------------------------------------------------------------------------------------
IEngine Lamar.Testing.IoC.Diagnostics Transient new Hemi() The Hemi