Wednesday, September 14, 2011

CQRS @ Develop With Passion Webinars

Thank you to everyone who participated in my webinar about CQRS today. A special thanks to Jean-Paul Boodhoo for inviting me to be a part of his Develop with Passion Webinar series. Unfortunately, I did not have the time to cover as many topics as I would have liked. Maybe we’ll have a “Part 2” webinar in the near future to cover the more advanced topics.

In the mean time, you can dig into the code I went through in the webinar. It is available on GitHub at There is some additional code there that I did not have a chance to cover. That includes another set of commands and events (StopTask), and some code for using a persistent event store and view model (as opposed to the in-memory ones we used in the demo) using RavenDB.

There is also a commented out section in the Bootstrapper that can be used re-populate the view model from the event store. This works perfectly if you use the RavenEventStore along with the in-memory PersistentViewModel, but I have so far been unable to get it working with the RavenPersistentViewModel (maybe someone can take a look and submit a pull request?). In any case, this technique allows you to create new view models, or modify existing ones, and have them populated with events that occurred from the beginning of time (or at least since your was released to production). You could even use this technique to keep your view model in-memory for production.

If you have any questions about the code, or CQRS in general, feel free to ping me @jasonsmale on twitter.

Oh, any if you want to review the few slides I had, the PowerPoint is also available on GitHub here.


Friday, July 01, 2011

CQRS Presentation Slides and Code

Thank you to everyone who came out to my presentation last night about Command and Query Responsibility Segregation at the TampaIASA meeting. The PowerPoint slides are available here. The code is on github under the src/samples/CQRS folder.

This was my first public presentation, so any feedback you have would be appreciated. Was I loud and clear enough? Did I explain things well enough? Did I go into details too much or not enough? Let me know on twitter @jasonsmale, or leave a comment on this post.

Also, a special thanks to AgileThought for providing the pizza!

I also want to thank, Greg Young, and Udi Dahan, as much of the materials, ideas, and inspiration for my presentation came from them.

Thursday, April 21, 2011

TFS 2010 Copy Files Custom Activity

I had the need recently to copy specific files from my TFS build output directory to a deployment directory. TFS has a built in activity to copy an entire directory, but no way to limit which files get copied. So, I created a quick implementation of CodeActivity that does just that.

  1. using System;
  2. using System.Activities;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  7. namespace BuildTasks.Activities
  8. {
  9.     public class CopyFiles : CodeActivity
  10.     {
  11.         [RequiredArgument]
  12.         public InArgument<IEnumerable<string>> SourceFileMasks { get; set; }
  14.         [RequiredArgument]
  15.         public InArgument<string> SourceDirectory { get; set; }
  17.         [RequiredArgument]
  18.         public InArgument<string> DestinationDirectory { get; set; }
  20.         public InArgument<bool> OverwriteFiles { get; set; }
  22.         protected override void Execute(CodeActivityContext context)
  23.         {
  24.             var sourceFileMasks = context.GetValue(SourceFileMasks);
  25.             if (sourceFileMasks == null || sourceFileMasks.Count() == 0) return;
  27.             var sourceDirectory = new DirectoryInfo(context.GetValue(SourceDirectory));
  28.             if (!sourceDirectory.Exists) return;
  30.             var destinationDirectory = context.GetValue(DestinationDirectory);
  31.             if (!Directory.Exists(destinationDirectory)) return;
  33.             var overwrite = context.GetValue(OverwriteFiles);
  35.             foreach (var sourceFileMask in sourceFileMasks)
  36.             {
  37.                 var sourceFiles = sourceDirectory.GetFiles(sourceFileMask);
  38.                 foreach (var sourceFile in sourceFiles)
  39.                 {
  40.                     sourceFile.CopyTo(Path.Combine(destinationDirectory, sourceFile.Name), overwrite);
  41.                 }
  42.             }
  43.         }
  44.     }
  45. }

The SourceFileMasks property allows you to pass in a list of file name masks that match the files you would like to copy. For example, if you needed to copy YourApp.exe, YourApp.exe.config, YourApp.pdb, Dependency.dll, Dependency.pdb, you could specify that with the following list:

{"YourApp.*", "Dependency.*"}

The screen shot below shows a simplified workflow using the CopyFiles activity to copy files from the build drop folder to a network share at “\\MyServer\Destination”. Also of note is the OverwriteFiles property where you can specify if any existing files should be overwritten.


I put together this code rather quickly, so let me know if you see anything overtly incorrect about it. The code is available as a gist at