Mar 17, 2009 / nhibernate ~ .net ~ ddd
Shorthand Repository Accessors

Today I was helping a friend with an NHibernate app, and noticed an opportunity to shorten some Repository code.

Here's an example...

[Test]
public void Should_Find_Tag_By_Name()
{
   // find some tags
   var tags = new TagsRepository();

   var cool = tags.FindByName("cool");
   var hot = tags.FindByName("hot");
   var cold = tags.FindByName("cold");

   // assert some stuff...
   Assert.AreEqual("cool", cool.Name); 
}

This FindByName isn't bad, but a shorter version is possible.

[Test]
public void Should_Find_Tag_By_Name()
{
   // find some tags
   var tags = new TagsRepository();

   var cool = tags["cool"];
   var hot = tags["hot"];
   var cold = tags["cold"];

   // assert some stuff...
   Assert.AreEqual("cool", cool.Name); 
}

See the difference? I quite like this syntax for name-based lookups. Implementing it is really easy.

public class TagRepository
{
   public Tag FindByName(string name)
   { 
      return (from t 
                 in UnitOfWork.Session.Linq<Tag>() 
                 where t.Name == name select t)
                 .FirstOrDefault();     
   }

   public Tag this[string name]
   {
      get{ return FindByName(name); }
   }

   public Tag this[long id]
   {
      get{ return UnitOfWork.Session.Get<Tag>(id); }
   }
}

Notice that I've also added a method that allows you to load a Tag by ID, using the following syntax:

var tagToLoad = long.Parse( Request["tagId"] );
var tags = new TagRepository();
var tag = tags[tagToLoad];

Anyone seen this approach used already?


You may also like...