Share via


2009 Advent Calendar December 3rd

Let's continue with the same lock interface and MutexLock implementation as yesterday. In order to switch from dependency injection using generics to a classical constructor injection we have to change the important object to something like this:

    1:      public class ImportantObject
   2:      {
   3:          private readonly Lock _lock;
   4:   
   5:          public ImportantObject() : this(new MutexLock())
   6:          {
   7:              
   8:          }
   9:   
  10:          public ImportantObject(Lock aLock)
  11:          {
  12:              _lock = aLock;
  13:          }
  14:   
  15:          public void ImportantMethod()
  16:          {
  17:              _lock.Lock();
  18:              // Do things.
  19:              _lock.Unlock();
  20:          }
  21:      }

Which can be tested like this:

    1:      public class Given_an_ImportantObject
   2:      {
   3:          class FakeLock : Lock
   4:          {
   5:              public int NumberOfLocks { get; private set; }
   6:   
   7:              public FakeLock()
   8:              {
   9:                  NumberOfLocks = 0;
  10:              }
  11:   
  12:              public void Lock()
  13:              {
  14:                  ++NumberOfLocks;
  15:              }
  16:   
  17:              public void Unlock()
  18:              {
  19:   
  20:              }
  21:          }
  22:   
  23:          private ImportantObject _importantObject;
  24:          private FakeLock _lock;
  25:   
  26:          public Given_an_ImportantObject()
  27:          {
  28:              _lock = new FakeLock();
  29:              _importantObject = new ImportantObject(_lock);
  30:          }
  31:   
  32:          [Fact]
  33:          void It_should_take_lock_when_ImportantMethod_is_called()
  34:          {
  35:              _importantObject.ImportantMethod();
  36:              Assert.Equal(1, _lock.NumberOfLocks);
  37:          }
  38:      }

However there is still one big problem with this solution. I'll tell you tomorrow.