Может быть, я немного растерялся, но почему IDoingBackgroundWork не может объявить простой метод Cancel, который, в свою очередь, будет реализован в базовом классе DoingBackgroundWorkerBase?
Таким образом, у вас будет простой способ отменить рабочий поток из вызывающей стороны, реализация по умолчанию и возможность изменить эту реализацию. Действительно ли для этого нужно использовать инъекцию? Я думаю, что старые добрые "простые" ОО-модели это правильно.
Обновление:
Тогда мне не нравится ни один подход. I Что бы ни понадобилось знать, он должен изящно остановиться в какое-то время, так что вы не можете просто вставить код и ожидать, что он выйдет с благодарностью, и статический класс добавит тот же уровень связывания (то есть I, что должно знать и использовать этот статический класс).
Я бы определил интерфейс ICancelable, а затем выполнил:
class DoingBackgroundWorkBase
{
public Cancel()
{
ICancelable cancelableWork = mWhatever as ICancelable;
if (cancelableWork != null)
cancelableWork.Cancel();
else
this.Abort();
}
}
и, конечно,
IDoingBackgroundWork work = factory.Worker;
work.Start();
так, чтобы IDoingBackgroundWork отвечал за ручной запуск потока (или, возможно, сам поток) и предоставление «изящного за неблагодарный» выход для случая, когда IWhущество также не реализует ICancelable.