MediatR MediatR 5.1 Released This release changes the default behavior of awaiting an enumerable of Task. Previous to this release, tasks where awaited using Task.WhenAll. This causes problems in a variety of environments and situations that expect sequential ordering. In this release, the default behavior for enumerables is to await in a foreach,
OSS Contoso University Examples with CQRS, MediatR, AutoMapper and more I was a bit surprised yesterday to see Scott Hanselman's post on my Contoso University sample app. That application basically takes the traditional Contoso University sample applications (of which there have been many), and try to adapt it to how our "normal" ASP.NET applications are
Docker Containers - What Are They Good For? Running Our CI Builds In the last post, I looked at creating a build environment, settling on a strategy where I used Docker Compose to create our build environment. From there, I need some way to actually run our build in an environment. Typically, my Windows build run in some sort of hosted agent,
AutoMapper AutoMapper extensions for Microsoft DI 5.0 released Hot off the presses, with some pretty big breaking changes. For the unfamiliar, the AutoMapper.Extensions.Microsoft.DependencyInjection package is the extension to the MS DI libraries used by ASP.NET Core and others. It lets you do: services.AddMvc(); services.AddAutoMapper(); And this package finds all AutoMapper configuration in
Docker Containers - What Are They Good For? Crafting our Build Environments In the last post, I looked at what comes "out of the box" with the Docker support in Visual Studio. While what we saw makes a lot sense for a good "F5" story, it's not that great for an actual build environment. In a
AutoMapper AutoMapper 7.0 Released Today I pushed out the AutoMapper 7.0 release: Release notes This release is mainly bug fixes, but keeping with the last few major releases, has a few breaking API changes. The major breaking API change is breaking out the expression mapping (OData support) so that it can release independently
MediatR MediatR 5.0 Released Another milestone for MediatR, I released 5.0 over the weekend. This release simplifies a number of interfaces and methods, but introduced some breaking changes along the way. The major change for MediatR in 5.0 is the combination of void requests to directly implement IRequest<Unit>. In
Architecture Vertical Slice Architecture Many years back, we started on a new, long term project, and to start off with, we built the architecture around an onion architecture. Within a couple of months, the cracks started to show around this style and we moved away from that architecture and towards CQRS (before it had
Docker Containers - What Are They Good For? Build Environments? In the last post, I looked at how containers could make local development easier for our typical projects, and mainly found they work well for dependencies. Next up, I wanted to see if they could make our continuous integration server "better". Better, as in, faster, more reliable, more
Microservices The False Dichotomy of Monoliths and Microservices When learning about microservices, you're nearly always introduced to the concept of a monolith. If you're not doing microservices, you're building a monolith. If you're not building a monolith, you must go with microservices. If you're building a monolith, perhaps
ASP.NET Core Migrating Contoso University Example to Razor Pages A coworker noticed that it looked like Razor Pages were the new "recommended" way of building server-side rendered web applications in ASP.NET Core 2.0. I hadn't paid much attention because at first glance they looked like Web Forms. However, that's not the
Microservices My Microservices FAQ Mainly because I get asked all the time about microservices and I'm tired of having to remember on the spot: What is a microservice? A microservice is a service with a design focus towards the smallest autonomous boundary. What is a service? (From Clemens) A service is software
Docker Containers - What Are They Good For? Local Dependencies Containers, huh, good god What is it good for? Local Dependencies! * Edwin Starr (also disputed) In the last post, I walked through our typical development pipeline, from local dev to production: Now for most of our developers, when we start a new project, we can just continue to work on
Docker Containers - What Are They Good For? Containers, huh, good god What is it good for? Probably something? * Edwin Starr (disputed) Here at Headspring, we're seeing more and more usage of Docker for local development. Having not really touched Docker or containers, I wanted to understand how Docker could help make our lives easier for
respawn How Respawn Works This post is mainly a reminder to myself when inevitably I forget what I was doing when designing Respawn. The general problem space is something I've covered quite a lot, but I haven't really walked through how Respawn works internally. The general problem is trying to
respawn Respawn 3.0 Released Respawn, the intelligent database deleter, reached the 3.0 milestone today. In this release, Respawn now supports complex circular/cyclical relationships. When Respawn detects a cycle in the graph, it substitutes a separate deletion strategy by disabling/enabling foreign key constraints just for those tables affected. This release also adds
Microservices Designing Microservice Messages: A Primer When you move from monoliths to microservices, and your services aren't 100% isolated from each other, eventually you need your microservices to communicate. They need to expose their capabilities to other applications and systems, and when you get to this point, you need to design their means of
Agile The Gemba Walk for Designing Software The Gemba Walk is a common lean practice for understanding a current process as-is before taking any action to improve that process. Traditionally, you'd see this in lean manufacturing, where you'd walk through a process, in-person, to understand the purpose, process, and people involved in creating
OSS Respawn 2.0 released A small release for Respawn but there's a breaking change in the underlying extension API, hence the major version bump. A couple things added here: * Support for MySQL * Support for Amazon RDS (from a bug fixed) The API change was added so that database adapters can specify the
Agile Trunk-Based Development or Pull Requests - Why Not Both? Trunk-Based Development movement is often proposed as the alternative to Git Flow. I understand this distinction - managing streams of work through long-lived branches can be trouble. For those new to TBD, it can look like this means throwing away all branches and everyone commits literally to trunk. Typically this
OSS MediatR 4.0 Released The last major release of MediatR brought a simplification in design. Instead of having several different IRequest types and IRequestHandler implementations with several flavors, MediatR would try at runtime to determine how a single IRequest should resolve to different IRequestHandler implementations (synchronous, async, async with a cancellation token). In practice,
AutoMapper AutoMapper 6.2.1 Released Release notes here. The previous release introduced some inadvertent breaking behavior changes in convention-based map creation and some DI scenarios. This maintenance release fixes these two issues by: * Allowing configuration of member lists to validate per-map * Allowing resetting of static mapper configuration (for testing scenarios) Find this release on NuGet:
OSS AutoMapper extensions for Microsoft DI 3.2.0 released Today I pushed out a small change to the AutoMapper.Extensions.Microsoft.DependencyInjection package to allow instance-based initialization. Before you initialize with services.AddAutoMapper(), set a configuration flag: ServiceCollectionExtensions.UseStaticRegistration = false; services.AddAutoMapper(); By default the extension will register using Mapper.Initialize, but with this flag off, the extension instead
OSS AutoMapper 6.2.0 Released Today I pushed out AutoMapper 6.2.0. Check out the release notes for the closed issues. A couple of big features in this release include inline maps, where AutoMapper no longer requires you to call CreateMap for new maps. I had resisted this idea (and even took out the
Microservices Composite UIs for Microservices - Data Composition Posts in this series: * A primer * Composition options * Client composition * Server composition * Data composition In the last post, we looked at composing at the server side, both through composing through widgets/components, and then for data sources for a widget themselves, using model composition to pull data from multiple sources