2009 Advent Calendar December 12th

So now we need to fix the broken ImportantProvider making sure it uses one lock:

    1:      public class Given_two_transactions_from_the_same_ImportantProvider
   2:      {
   3:          private FakeLock _lock;
   4:          private ImportantProvider _importantProvider;
   5:          private Transaction _transaction1;
   6:          private Transaction _transaction2;
   7:   
   8:          public Given_two_transactions_from_the_same_ImportantProvider()
   9:          {
  10:              _lock = new FakeLock();
  11:              _importantProvider = new ImportantProvider(new DummyObject(), _lock);
  12:              _transaction1 = _importantProvider.Transaction;
  13:              _transaction2 = _importantProvider.Transaction;
  14:          }
  15:   
  16:          [Fact]
  17:          void It_should_be_two_different_transactions()
  18:          {
  19:              Assert.NotSame(_transaction1, _transaction2);
  20:          }
  21:   
  22:          [Fact]
  23:          void It_should_be_the_same_ImportantObject_returned_by_both_transactions()
  24:          {
  25:              Assert.Same(_transaction1.ImportantObject, _transaction2.ImportantObject);
  26:          }
  27:   
  28:          [Fact]
  29:          void It_should_take_lock_once_for_each_transaction()
  30:          {
  31:              Assert.Equal(2, _lock.NumberOfLocks);
  32:          }
  33:      }

As you can see in the test I've chosen constructor injection for the lock in this case:

    1:      public class ImportantProvider
   2:      {
   3:          private ImportantInterface _importantObject;
   4:          private Lock _lock;
   5:   
   6:          public ImportantProvider(ImportantInterface importantObject, Lock aLock)
   7:          {
   8:              _lock = aLock;
   9:              _importantObject = importantObject;
  10:          }
  11:   
  12:          public Transaction Transaction
  13:          {
  14:              get
  15:              {
  16:                  return new Transaction(_importantObject, _lock);
  17:              }
  18:          }
  19:      }