Category: C#

Exception capture in .NET Core

app.UseExceptionHandler(options => { options.Run( async context => { var error = context.Features.Get<IExceptionHandlerFeature>(); if (error is object) { Log.Error( “EXCEPTION {method} {url} {query} => {exception}”, context.Request.Method, context.Request.Path.Value, context.Request.QueryString.Value, error.Error); } }); }); Read more →

Debug XmlSerializer

var serializer = new XmlSerializer(typeof(<x>)); serializer.UnknownAttribute += (sender, args) => System.Diagnostics.Debug.Fail($”Unknown attribute { args.Attr.Name }=\'{ args.Attr.Value }\'”); serializer.UnknownNode += (sender, args) => System.Diagnostics.Debug.Fail($”Unknown Node: {args.Name}\t{args.Text}”); serializer.UnknownElement += (sender, args) => System.Diagnostics.Debug.Fail($”Unknown Element: { args.Element.Name }\t{ args.Element.InnerXml}”); serializer.UnreferencedObject += (sender, args) => System.Diagnostics.Debug.Fail($”Unreferenced Object: { args.UnreferencedId }\t{ args.UnreferencedObject.ToString() }”); Read more →

Access app.config from a texttemplate

<#@ template debug=”false” hostspecific=”true” language=”C#” #> <#@ assembly name=”System.Core” #> <#@ assembly name=”System.Configuration” #> <#@ import namespace=”System.Linq” #> <#@ import namespace=”System.Text” #> <#@ import namespace=”System.Collections.Generic” #> <#@ import namespace=”System.Configuration” #> <#@ output extension=”.tt.cs” #> <# var projectPath = Host.ResolveAssemblyReference(“$(ProjectDir)”); var configFile = projectPath + “App.config”; var map = new ExeConfigurationFileMap() { ExeConfigFilename = configFile }; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);… Read more →


CQS means “Command-query separation”. It was introduced by Bertrand Meyer as part of his work on the Eiffel programming language. A method is either a command performing an action, or a query that returns data, but not both. Being purely action-performing methods, commands always have a void return type. Queries, on the other hand, should not have any observable side… Read more →

Software Development Principles & Patterns

Who even gives a ****? I do. My Software Development Principles Unit Testing / Test Driven Development / Behaviour Driven Development CQRS Command and Query Responsibility Separation SOLID Single Responsibility Principle Open/Closed Principle Liskov’s Substitution Principle Interface Segregation Principle Dependency Inversion Principle AOP Aspect-Oriented Programming Unit Testing A unit as the smallest testable part of an application. In object-oriented programming, a… Read more →

Updated Command & Query Handlers

I’ve recently updated my definitions for Query Handlers. I’ve changed the original IQuery<Tresult> to IReturn<TResult> as, for me, it better reflects the intention of the [marker] interface. public interface ICommandHandler<TCommand> { void Execute(TCommand command); } public interface IReturn<TResult> { } public interface IQueryHandler<TQuery, TResult> where TQuery : IReturn<TResult> { TResult Execute(TQuery query); } Read more →

Url Redirect for moved blog

namespace Director { public class HttpModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(this.context_BeginRequest); } private void context_BeginRequest(object sender, EventArgs e) { HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context; if (context.Request.FilePath.TrimEnd(‘/’).Length > 0 && !File.Exists(context.Request.PhysicalPath)) { context.Response.Redirect( $”{context.Request.FilePath}”, true); } } public void Dispose() { } } } <system.webServer> <modules runAllManagedModulesForAllRequests=”true”> <add name=”HttpModule” type=”Director.HttpModule” />… Read more →

Holistic Abstractions (Take 2)

In this post I will outline an updated perspective on Commands and Queries with respect to applying cross-cutting concerns (aka Aspects or Decorators). If you are unfamiliar with these two patterns then please see these posts here and here for a great introduction. Bertrand Meyer defines CQS as: every method should either be a command that performs an action, or… Read more →

dynamic code generation in c#

Copied directly from Given a Dictionary<string, string>, convert that dictionary into a type in as performant a manner as possible. The conversion will happen many time, and first time costs are acceptable. public static Func<Dictionary<string, string>, T> Generate<T>() where T : new() { var dic = Expression.Parameter(typeof (Dictionary<string, string>), “dic”); var tmpVal = Expression.Parameter(typeof (string), “tmp”); var args =… Read more →