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: }