With the solution we have from yesterday we still have a big problem. Whoever uses ImportantObject must also create the transaction. That is really a bad idea since it is too easy to use the ImportantObject in an unsafe way (i.e. not using transactions at all). To fix this I'm going to introduce an ImportantProvider:

1: public class Given_an_ImportantProvider 2: { 3: private ImportantProvider _importantProvider = new ImportantProvider(new DummyObject()); 4:   5: [Fact] 6: void It_should_return_a_transaction() 7: { 8: Assert.NotNull(_importantProvider.Transaction); 9: } 10: } 11:   12: public class ImportantProvider 13: { 14: private ImportantInterface _importantObject; 15:   16: public ImportantProvider(ImportantInterface importantObject) 17: { 18: _importantObject = importantObject; 19: } 20:   21: public Transaction Transaction 22: { 23: get 24: { 25: return new Transaction(_importantObject, new MutexLock()); 26: } 27: } 28: }