August 18, 2006 at 3:46 pm
· Filed under Agile, c#
I have read about the benefits of aspect orientated programming (AOP) and decided to investigate the possibility of using an open source AOP Framework to standardise exception handling in our application.
Click here for a list of Open Source Aspect Orientated Frameworks
From what I had read I had great hopes for AOP: I was expecting to be able to add exception handling and logging to some classes by writing an exception handling class using the AOP framework and then using a configuration file, configure which classes magically had exception handling applied.
Unfortunately there is no such thing as magic (sorry kids), there needs to be a way of weaving the code written for exception handling (Advice) into the methods specified by the configuration file.
The AOP frameworks seem to take two different approaches to weaving, Compile time weaving and Run time weaving; each of these solutions have their own compromises.
I initially discounted using a Compile time weaving framework such as AspectDNG, because of the impact on our build process.
I first looked into Runtime weaving implementation AspectSharp but after discovering a bug running their example I found a message on the forum saying the AspectSharp project had stalled. I next looked at the SpringFramework which at first seemed promising, I was disappointed to find out that in order to use runtime weaving you are faced with a few rather large compromises: Firstly the classes in which you want to apply the Advice to have to implement an interface, which isn’t so bad I suppose. Secondly however there is a bigger compromise, every call you make to your classes must be replaced with a call to a proxy.
so
command.Execute();
would be replaced with,
ICommand command = (ICommand) ctx[”myServiceObject”];
command.Execute();
Is this intrusive use of a proxy just a bit too much of a compromise to have your domain logic free from distractions like tracing and exception handling? I suppose the answer is “it depends”. For my situation this was too much of a risk, I didn’t have time to investigate any performance penalties, but this surely must be an issue too.
The future of AOP must be with compile time weaving; if this could be integrated smoothly with Visual Studio and the build process then this surely would be an attractive option.
Permalink
del.icio.us
July 28, 2006 at 1:34 pm
· Filed under Agile, c#
Encapsulate Collection is a refactoring from Martin Fowler’s book Refactoring: Improving the Design of Existing Code, the refactoring is applied when you have a class with a public property of a collection type, the intent is to stop the collections internal data structures from being exposed.
I was thinking about how to apply this refactoring using .NET 2.0 and generics and decided on the implementation below;
public class Order
{
private List<IOrderLine> _orderLines;
public ReadOnlyCollectionList<IOrderLine> OrderLines
{
get { return _orderLines.AsReadOnly(); }
}
public Order()
{
_orderLines = new List<IOrderLine>();
}
public void AddOrderLine(IOrderLine orderLine)
{
_ orderLines.Add(orderLine);
}
}
The generic ReadOnlyCollection Class provides a base class for a generic readonly collection, using this class as opposed to the generic IList, has the advantage that someone implementing the class can see at design time that the class is readonly; however the generic IList may be a better alternative as more of collections internal data structure is hidden: any thoughs on this would be much appreciated.

Permalink
del.icio.us
July 28, 2006 at 11:24 am
· Filed under Agile, c#
I am have just started a new .Net 2.0 project in my spare time, I will be developing an estimating app. We are soon to be moving over to .Net 2.0 in work, so hopefully this project will give me a chance to get up to speed.
I also want to try out some new things, like Object Relational Mapping, which really seems like a big step forward; this was one of the features that really impressed me about Rails. Rails enforced the Active Record Pattern; I assume that .Net implementations will be a little more flexible.
One of the things that concerned me initially about object relational mapping was the potential performance hit over the traditional approach of using stored procedures, in the book I am currently reading Applying Domain-Driven Design and Patterns: With Examples in C# and .NET the author suggests that ORM could be used for the majority of the code, with performance critical parts being written with stored procedures; this really seems like a good idea to me, I can imagine the time that could be saved on the majority of projects using this approach.

Permalink
del.icio.us
May 24, 2006 at 11:42 pm
· Filed under Agile, ruby on rails
With a bit of guidance from my Ruby on Rails book, I was ready to deploy my first Rails app wiisites.com and all within an hour; along way from complete, but I was happy with it for the first iteration. Allot of thought has obviously gone into the Rails framework, by making a less flexible than .Net and enforcing things like object relational mapping and the use of the Model View Controller pattern Rails is easy to learn and simple to use; that’s why I was horrified to find out how difficult Rails is to deploy.
In my eagerness to get my application deployed, I initially tried the XCopy approach dumping the application directories in my sub domain; of course this would have been too good to be true: a bit more investigation was called for.
Again wanting a quick solution I turned to google, it seemed the recommended best practice was to use a program called Capistrano to automate the deployment. I began to follow the manual I found http://manuals.rubyonrails.com/read/book/17. It seems that it is recommended to use the source control program Subversion along with Capistrano, so I began installing Subversion (use the one click installer). However Subversion requires apache, so I had to install Apache that too. After an evening spent messing around with unfamiliar configs I called it a day.
The following day with a fresh head it occurred to me that there must be a simpler solution, after all my app was little more that a hello world so surely an automated build was a bit overkill. I decided to connect to the server using my shell account and recreate the app on the server; when the app was created I ftp’d the app from my development machine across to the server. After a couple of daft mistakes with configurations I got my app working, its just my URL was now something like www.wiisites.com/wiisites/wiisites/public/, I’m sure you will agree not the most elegant url you have ever seen.
The next step was to sort out the messy url; this is done with some unix wizardry called a symlink which created a special kind of file that links to somewhere else.
I needed a file called wiisites that linked to the location of my rails app. I had created an addon domain using the bluehost control panel for wiisites.com, so I had a subdomain under my web route for wiisites; this caused me a problem because I needed to replace that subdomain with a symlink in order to redirect to the rails directory.
I stumbled across an article Getting Ruby Running on Bluehost which cleared things up for me. I renamed the directory “wiisites” that was created when I setup the addon domain and created a symlink with the name of “wiisites” in its place.
ln -s ~/www/wiisites_link/wiisites/public/ ~/www/wiisites/
The above symlink creates a symlink file called wiisites in the directory www pointing to my rails app directory /www/wiisites_link/wiisites/public/.
At last a working, semi complete web application and it only took 1hour 2days.
Permalink
del.icio.us
May 20, 2006 at 10:44 am
· Filed under Agile, TDD, ruby on rails
A few years ago while at uni, I read the book The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas; the books aim is to help you to become a better programmer, and it provides loads of tips and best practices covering everything from estimating, testing to design guidelines. One of the main characteristics the book suggests will make you a better programmer is your ability to work with a broad range of technologies; so in my case, although I work with .net on a day to day basis, the suggestion is I should be familiar with other languages and platforms.
This has always made sense to me, for example; if you were going to write a program to search a folder for a text file containing a certain phrase, then although this would be relatively straight forward using .Net, it would literally be just a few lines using Perl. The same has been true with web technologies, although it may be easy to develop a simple website using the feature rich .net framework, it may be overkill for a small personal website that just maintains a photo gallery: using php it would be easy to incorporate a free off the shelf photo gallery system like Gallery 2 that is already fairly mature and tested for bugs.
I have used php on a few personal sites and think that it has benefited my html and css skills, but even with template engines like Smarty that separate the presentation layer, php to me has always felt a bit of a step backwards, when compared to asp.net.
I have just started a personal site wiisites that as the name suggests will simply maintain a directory of Nintendo wii web sites. I don’t really want to spend too much on hosting, so have opted to add the domain to my bluehost account and develop the site on the Linux platform; which would have usually meant Perl, or Php, but now there is a new contender for the open source title, Ruby on Rails.
Ruby is a fully object orientated language and Rails is a framework designed to greatly simplify web development based on the Model View Controller pattern. After following OnLamp tutorial which guides you through the easiest way to install and develop your first project, I can say that Ruby on Rails seems like a massive leap forward for open source web development; it appeals to me because its;
- Object orientated, so should be easy enough to learn.
- Follows the familiar Model View Controller pattern.
- Greatly simplifies alot of the plumbing, like data access.
- Ajax built in.
- Embraces Agile development with unit testing built into the framework.
- Is quick to use.
- Cheap to host.
I have just bought a book on Rails and am looking forward to learning more about it, hopefully there will be lessons learned in Rails that could be applied to future .Net projects.

Permalink
del.icio.us
May 18, 2006 at 1:52 pm
· Filed under Agile, TDD, c#, nmock, nmock2
When unit testing you should try to test the class of interest in isolation, this means removing any dependencies with other components; for example I needed to test in isolation a class that is instanciated by passing to it an object that implements IDataReader.
public DictionaryItem(IDataReader)
By creating a mock object for IDataReader, the class can be tested in isolation of the Data Access Layer (DAL).
You could either create the necessary mock object, by building your own class implementing IDataReader or use a mock object framework to help you.
For some time now NMock has been regarded as a powerful framework for generating mock objects, however the original NMock had a few limitations, one of which seemed to prevent nmock from being used to test a class that exposed an indexer. Fortunately NMock2 the new version of nmock, solves this problem. NMock2 is a total re-write micking jMock were “expectations are expressed in a more conversational style”; this makes NMock to easier to work with than its predecessor.
The following code creates the dataReaderMock mock object, which can then be passed to my DictionaryItem class in my unit test;
Mockery mocks = new Mockery();
IDataReader dataReaderMock = (IDataReader)mocks.NewMock(typeof(IDataReader));
Expect.AtLeastOnce.On(dataReaderMock).Method(”Read”).Will(Return.Value(true));
Expect.Once.On(dataReaderMock).Method(”Read”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).Method(”NextResult”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).GetProperty(”IsClosed”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).Method(”Close”);
Expect.Once.On(dataReaderMock).Get[”COL_1″].Will(Return.Value(4));
Expect.Once.On(dataReaderMock).Get[”COL_2″].Will(Return.Value(”col1ValueExpectedByUnitTest”));
Expect.Once.On(dataReaderMock).Get[”COL_3″].Will(Return.Value(”col2ValueExpectedByUnitTest”));
return dataReaderMock;
As you can see the expectations on a Mock2 object are easy to read; at least one expectation is made for each propety or method you expect to be called. The expectations reflect how the constructor of DictionaryItem will use the IDataReader; in my case the mock object reflects an DataReader with only one DataRow. The first part of the expectation defines how many times you expect the method to be called “Expect.AtLeastOnce.On”, the second part defines the name of the method, property or indexer expected to be called “Method(”Read”)” and the last part defines what value should be returned “Will(Return.Value(true))”.
If you use the mock object an nunit test if any of the expectations have not been met, the test will fail.
Download NMock2, NMock2 Tutorial

Permalink
del.icio.us