Как и другие, предложили, интерфейсы путь сюда. Я бы немного изменил интерфейс от предложения Moo-Juice sugestion ...
`
// Почему этот блок не отформатирован как код ???
открытый интерфейс ITimer {
void StopTimer (); // и т.д ...
void StartTimer (); // и т.д ...
TimeSpan Duration {get;} // eo интерфейс ITimer
} `
Теперь вам нужно будет ввести ITimer в ваш класс, который его использует. Самый простой способ сделать это называется внедрением зависимости. Наиболее распространенный подход для достижения этого называется инжектором конструктора.
Таким образом, при создании класса, которому требуется таймер, вы передаете таймер в класс при его создании.
В основном вы делаете:
var foo = new Foo(new WebTimer());
Поскольку это будет довольно быстро усложняться, вы можете использовать несколько помощников. Эта модель называется инверсией контроля. Есть некоторые рамки, которые помогут вам, например, ниндзя или замок Виндзор.
Оба являются контейнерами с инверсией управления (IOC). (Это секретный соус)
По сути, вы «регистрируете» свой таймер в МОК, а также регистрируете свой «Foo». Когда вам нужен "Foo", вы просите ваш контейнер IOC создать его. Контейнер смотрит на конструктор, находит, что ему нужен ITimer. Затем он создаст для вас ITimer, передаст его в конструктор и, наконец, передаст вам полный класс.
Внутри вашего класса вам не нужно иметь никаких знаний об ITimer или о том, как его создавать, поскольку все это было перемещено наружу.
Для разных Приложений теперь вам нужно только зарегистрировать правильные компоненты, и все готово ...
P.s .: Будьте осторожны и не путайте IOC-контейнер с сервисным локатором ...
Ссылки:
http://ninject.org/download
http://www.castleproject.org/container/index.html
http://www.pnpguidance.net/Category/Unity.aspx