Utah Code Camp: CQRS Presentation

Comments

I will be giving a presentation on CQRS at the local code camp this Saturday, March 27 at about 3:00 PM. Here’s the schedule:  http://utahcodecamp.com/Web/Schedule If you are unable to attend, I will be recording the presentation and posting the video and slides…

Event Sourcing and CAP Requirements

Comments

One of the great things about CQRS is that, because all read responsibilities have been removed from the service layer, the mechanism for storage can be vastly different.  We can continue to use a relational database but we also have the option to utilize alternative storage engines, such a…

Event Sourcing and the Event Pipeline

Comments

Greg recently posted on the benefits of using event sourcing instead of traditional state-based persistence mechanisms.  It’s a great article and definitely worth reading multiple times.  But there was one paragraph in particular that caught my attention that gave me one of those great ah-ha moments. One…

CQRS: An Introduction for Beginners

Comments

I had the chance to present CQRS to the local .NET user group this week.  The speaker had a last minute conflict so I volunteered to step up and speak.  I only had a few hours to prepare.  So what did I do?  I had previously…

Domain Models, Aggregate Roots, and Lookup Tables

Comments

A problem that we experienced recently was that of dealing with and wrapping lookup tables.  By definition, a domain model is supposed to be isolated from the outside world.  It shouldn’t have any concept of data access or persistence.  Because a domain model is isolated and…

Aggregate Roots and Shared Data

Comments

When working on a new domain model a few days ago, we ran into an interesting issue.  What happens when an aggregate has shared data?  You know, data that is common or shared between aggregate roots?  This is a question that also recently came up on the…

CQRS Presentation Tonight

Comments

I will be giving a free presentation tonight at 6:00 PM on CQRS.  I’m going to give some historical background on CQRS and I will show how it resolves a lot of the pain and friction that developers experience when building systems.  Further, I’m going…

CQRS: Udi Dahan Style

Comments

Mark Harris recently recorded Udi Dahan talking about CQRS when he was at a user group in Australia. It’s about 90 minutes long, but if you’re trying to wrap your head around CQRS, it’s a great place to start. One other note, Udi’s style is independent…

DRY: Don’t Repeat Yourself

Comments

It might just be me, but every single time I see/hear the the acronym DRY used on a blog/podcast, it is always followed by: “(Don’t Repeat Yourself)”. Does this strike you as ironic? …

Extreme Web UI Scalability – Part 2

Comments

Yesterday I did a massive post about separating HTML layout from user data and then using a JavaScript templating engine to bind up JSON data object which contains user-specific information.  I also talked about setting the HTTP expiration policy on the HTML files and using CDNs to scale out…

Postulating Extreme Web UI Scalability

Comments

I’ve been working with CQRS for almost a year.  Ever since I first heard about it, I was immediately convinced that it had the ability to vastly simplify a lot of unnecessary development overhead.  In this particular post, I will not be discussing event sourcing which is…

Persistence Ignorance and ActiveRecord

Comments

Jimmy Bogard recently tweeted that Persistence Ignorance does not apply to the ActiveRecord pattern.  I couldn’t agree more because ActiveRecord is about creating a strong coupling to the database schema. Persistence Ignorance is about keeping your business objects ignorant of the underlying mechanism used to persist them and…

The Software Simplist

Comments

Udi Dahan is known as the “Software Simplist”.  What does he mean by simple?  Is he saying that software cannot be used to tackle complex problems?  Or does he mean that we work at a problem until a simple, clean, and concise solution presents itself?  And…

CQRS: Reporting Database Access Strategies

Comments

One of the things that I love about CQRS is that it completely eliminates the impedance mismatch that you normally experience with traditional ORMs. It is incredibly compelling to be able query and retrieve all values necessary for a particular report or screen in a single database call because of…

DDDD: Why I Love CQRS

Comments

[UPDATE: This post was written about the time Greg Young formally named his CQS architectural implementation of command query separation.  Because of the change in terminology this post was written with the understanding that CQRS consisted of all elements commonly associated with CQRS.  In other words, CQRS herein…

DDD: Entity Injection

Comments

In a former life, I wouldn’t think twice about using dependency injection to put behavior into a domain object.  But the more I learned about traditional DDD, the more I found that it was considered “taboo” to inject things into your entity objects.  Obviously injecting behavior into…

Testing Time - The Best of Both Worlds

Comments

I am a big fan of “the simplest thing that could possibly work”.  The elegance and simplicity of the following code is hard to overstate: public static Func Now = () => DateTime.Now It’s wonderful because there are no external dependencies, no external libraries, and no versioning issues.  Furthermore…

Testing Time—Static Calls and ISystemTime

Comments

In my previous post, I talked about a technique that I saw for testing time and also about how I simply injected some kind of ISystemTime/IClock interface.  The problem with that was having to do injection at every level—including domain entities. Oren Eini’s method, while probably…

DDD: Entity Injection and Mocking Time

Comments

[UPDATE: I have created an open source library based upon the concepts found below.] In my early experience with DDD, I loved injecting dependencies into my domain entities.  I have since repented.  The one downright nasty dependency that we could never quite slip away from was…time. …

DDDD: Circular Disk-backed Buffer

Comments

In a few of Greg’s video presentations regarding DDDD, he mentions using a circular, disk-backed buffer.  As far as I can tell, he’s using this as a temporary storage mechanism when events are committed.  He then has a single consumer reading the events from this buffer…

Git Submodules like svn:externals

Comments

One critical difference between Git submodules and Subversion “externals” is the concept that submodules are locked to a particular commit.  Normally this is a “good thing” because blindly attaching yourself to a particular branch in Subversion can have interesting an unexpected consequences when the branch changes out from underneath…

Continous Integration Workflow

Comments

With permission, here is our general CI workflow document that my team drafted that governs our vision regarding how we do CI: Continuous Integration Workflow Abstract We want to provide developers with the ability to make changes to project source code and to then automatically, transparently, and consistently subject all…

CI Servers and Build Scripts

Comments

About a year ago, I read Continuous Integration: Improving Software Quality and Reducing Risk. It’s a great book that talks about the importance of making your CI server the hub of development. One part of the book that was very insightful was the exact role of build scripts. …

Gallio (v3.0.6 and v3.1) with NCover v1.5.8 on x64

Comments

I spent the better part of a day trying to get Gallio’s runner to execute NCover and run our unit and integration tests as part of our build process.  Our build server and all of our developer workstations run some variant of 64-bit Windows, e.g. Vista, 2008…

NHibernate, Inverse, and Object Associations

Comments

You gotta love NHibernate.  But sometimes there are little quirks the drive you nuts—at least until you understand how NHibernate handles things.  We ran into one such “hiccup” the other day. Our objective was to have a parent object contain a list of child objects.  Simple…

Microsoft Source Server with Git

Comments

I try to avoid the debugger at all costs, but it does come in handy sometimes.  You’ll even catch Uncle Bob in the debugger on occasion.  When using a compiled language, you basically “lose” the source code once compiled.  Of course bytecode languages can be decompiled…

Git Lost (and Git Submodules)

Comments

We’ve been using Git for a little while now in a Windows environment and we have been quite pleased with it and the capabilities it affords us as part with its decentralized workflow.  We have a number of shared projects or “common libraries” that we use between projects…

Accountants Don’t Use Erasers

Comments

Mark Needham posted on his blog a link to this article which I hadn’t read before.  It’s a really good read about the logic behind write-only storage: http://blogs.msdn.com/pathelland/archive/2007/06/14/accountants-don-t-use-erasers.aspx …

DDDD: The Event Storage Doesn’t Store Commands

Comments

I’ve been involved in a few projects recently that didn’t get into DDD much, so I’ve been out of the loop for a few months.  As I was getting back into things, I had a question regarding what was stored in the “event store” for a…

DDDD: Distributing A Single Bounded Context

Comments

In a previous post, I detailed all of the reasons why processing messages one by one with an aggregate root was a good thing.  I am now going to contradict some of the main points in that post.  While certain aspects still hold true, there is a much…

Poor Man’s Dependency Injection: Take 42, Action!

Comments

I watched the battle from the sidelines where Jimmy Bogard talked about how not to do “poor man’s dependency injection”.  Then Tim Barcz gave his input.  Then Chad Myers got into the mix. Considering this blog is called Inversion of Control Freak, I should probably add my…

Behavior and Data Centricity

Comments

As I look back at applications and systems that I have been involved with over the years, what strikes me is how data-centric those applications were.  In fact, the driving force behind most of those applications was the data.  The behavior of an application was looked at as…