А на ваш 2-й и 3-й вопрос;
Три беглых рисунка, которые я заметил
Первый использует оператор using (C # 2.0) для запуска кода в определенном контексте, например:
using(var transaction = new Transaction())
{
// ..
// ..
}
При этом используется конструктор и средство удаления Transaction для настройки транзакции, а затем запускается код в этом контексте.
Второй делает почти то же самое, но с лямбдами, это часто используется в Rhino Mocks, например.
(new Transaction()).Run( () => mycode(); );
Самый известный свободный интерфейс - это использование возвращаемых типов для цепочки вызовов методов. В основном методы возвращают это, так что вы можете соединять вызовы для одного и того же объекта. Но вы также можете вернуть разные объекты, чтобы изменить контекст в зависимости от вызванного метода. Если у вас есть объект, который может быть запущен только в транзакции (извините, не могу представить другой пример), вы можете предоставить ему метод StartTransaction, который возвращает инициализированную транзакцию, в которой вы можете запустить call run и stoptransaction, в псевдокоде:
class Runner
{
Transaction StartTransaction()
{
return new Transaction(this);
}
}
class Transaction
{
Transaction Run()
Transaction StopTransaction()
}
где вызов выглядит как
var runner = new Runner();
runner
.StartTransaction()
.Run()
.StopTransaction();
Конечно, вам нужно добавить все виды обработки ошибок и т. Д.