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
Testing Respawn vs SQL Server Snapshots One of the newer features of SQL Server is the ability to snapshot a database at a point in time, and restore it. A commenter on the Respawn announcement asked if I had looked at this feature for resetting a test database to a known point. I hadn't,
Microservices Composite UIs for Microservices - Server Composition Posts in this series: * A primer * Composition options * Client composition * Server composition * Data composition In the last post, we looked at techniques for composing on the client side. One of the issues we saw is there aren't really a lot of tools to perform composition, nor are there
OSS Bulk Writer 1.0.1 released A few years back, I had a somewhat new problem on hand. I needed to, on a daily basis, wipe and re-insert about 100 million rows of product data into a customer support database. The data was in the form of a single CSV file (zipped of course), and I
Testing Respawn 1.0.0 released Respawn is a small library to help reset your database to a known state before tests. If you're like our teams and rely on integration/subcutaneous tests as your final "green" test for feature complete, keeping a consistent database state can be frustrating. Respawn solves this
Microservices Composite UIs for Microservices - Client Composition Posts in this series: * A primer * Composition options * Client composition * Server composition * Data composition In the last post, we looked at possible areas of composition: * Client * Server * Database In this post, we'll look at compositional options in the browser. From the outset, I can at least confirm that
AutoMapper joins the .NET Foundation Today marks a new era for the AutoMapper project, as we join the .NET Foundation. There were a number of reasons I wanted AutoMapper, from the legal to continuity. I'm going to steal Peachpie's announcement a bit for the benefits: * As a contributor: When you make
Microservices Composite UIs for Microservices - Composition options Posts in this series: * A primer * Composition options * Client composition * Server composition * Data composition In our previous post, we looked at why we might compose, seeing it's primarily an edge concern, where we're exposing our services to end users. Those end users could be customers, or
Microservices Composite UIs for Microservices - A Primer Posts in this series: * A primer * Composition options * Client composition * Server composition * Data composition Microservices can be easy, if we never have to compose, orchestrate, or otherwise integrate between multiple services. If our inter-service communication is low, we can piecemeal a solution based on basic integration patterns such as messaging.
AutoMapper 6.1.0 released See the release notes: v6.1.0 As with all of our dot releases, the 6.0 release broke some APIs, and the dot release added a number of new features. The big features for 6.1.0 include those for reverse-mapping support. First, we detect cycles in mapping classes
Distributed Systems Dealing With Optimistic Concurrency Control Collisions Optimistic Concurrency Control (OCC) is a well-established solution for a rather old problem - handling two (or more) concurrent writes to a single object/resource/entity without losing writes. OCC works (typically) by including a timestamp as part of the record, and during a write, we read the timestamp: 1.
respawn Respawn 0.3.0-preview1 released for netstandard2.0 Respawn, a small library designed to ease integration testing by intelligently clearing out test data, now supports .NET Core. Specifically, I now target: * net45 * netstandard1.2 * netstandard2.0 I had waited quite a long time because I needed netstandard2.0 support for some SqlClient pieces. With those pieces in place,
Domain Driven Design Domain Command Patterns - Handlers In the last post, we looked at validation patterns in domain command handlers in response to a question, "Command objects should [always/never] have return values". This question makes an assumption - that we have command objects! In this post, I want to look at a few of
Architecture Domain Command Patterns - Validation I don't normally like to debate domain modeling patterns (your project won't succeed or fail because of what you pick), I do still like to have a catalog of available patterns to me. And one thing that comes up often are "how should I model
REST Swagger, the REST Kryptonite Swagger, a tool to help design, build, document, and consume RESTful APIs is ironically kryptonite for building actual RESTful APIs. The battle over the term "REST" is lost, where "RESTful" simply means "an API over HTTP" but these days is 99% of the time
Architecture Refactoring Towards Resilience: Process Manager Solution Other posts in this series: * A primer * Evaluating Stripe Options * Evaluating SendGrid Options * Evaluating RabbitMQ Options * Evaluating Coupling * Async Workflow Options * Process Manager Solution In the last post, we examined all of our coordination options as well as our process coupling to design a solution for our order processor. In
Architecture Refactoring Towards Resilience: Async Workflow Options Other posts in this series: * A primer * Evaluating Stripe Options * Evaluating SendGrid Options * Evaluating RabbitMQ Options * Evaluating Coupling * Async Workflow Options * Process Manager Solution In the last post, we looked at coupling options in our 3rd-party resources we use as part of "button-click" place order, and whether or
Architecture Refactoring Towards Resilience: Evaluating Coupling Other posts in this series: * A primer * Evaluating Stripe Options * Evaluating SendGrid Options * Evaluating RabbitMQ Options * Evaluating Coupling * Async Workflow Options * Process Manager Solution So far, we've been looking at our options on how to coordinate various services, using Hohpe as our guide: * Ignore * Retry * Undo * Coordinate These
Refactoring Towards Resilience: Evaluating RabbitMQ Options Other posts in this series: * A primer * Evaluating Stripe Options * Evaluating SendGrid Options * Evaluating RabbitMQ Options * Evaluating Coupling * Async Workflow Options * Process Manager Solution In the last post, we looked at dealing with an API in SendGrid that basically only allows at-most-once calls. We can't undo anything, and
Refactoring Towards Resilience: Evaluating SendGrid Options Other posts in this series: * A primer * Evaluating Stripe Options * Evaluating SendGrid Options * Evaluating RabbitMQ Options * Evaluating Coupling * Async Workflow Options * Process Manager Solution In the last post, we found we had the full gamut of options for coordinating our distributed activity: We could ignore the failure (and have money