Слово «церемония» в описании интерфейсов звучит подозрительно, как комментарий от Ruby-ist, который против статической типизации. С хорошим инструментом рефакторинга и шаблонов большая часть церемонии все равно остается незамеченной.
Несмотря на то, что передача делегата имеет свое место, IoC с интерфейсами обычно проще реализовать, использовать, понимать и поддерживать.
Рассмотрим типичный конструктор:
public class MyClass
{
public MyClass(IAmEasyToUnderstand easy)
{
if (easy == null) throw new ArgumentNullException("easy");
}
public MyClass(Func<bool, int, int, Point> IAmNot, Func<bool> Clear, Action aboutAnything)
{
//multiple null checks.
}
}
public interface IAmEasyToUnderstand
{
bool DoPointStuff(int a, int b, Point point);
bool CanHazExecute();
Action RunRun();
}
Теперь рассмотрим класс, который возвращает интерфейс для использования другим:
public MyClass
{
//IFace
public IAmEasyToUnderstand FindEasy();
//Not Iface
Func<bool, int, int, Point> ReturnPointStuffDoer();
Func<bool> ReturnCanHazExecuteCallback();
Action WowThisIsAnnoying();
}
var easy = myclassInstance.FindEasy();
var consumer = new EasyConsumer(easy);
....
var consumer = new EasyConsumer(
myClassInstance.ReturnPointStuffDoer(),
myClassInstance.ReturnCanHazExecuteCallback(),
myClassInstance.WowThisIsAnnoying());
При рассмотрении последнего примера потребления очевидна очистка:
var consumer = new EasyConsumer(myclassInstance);
, что означает, что вам нужно заменить тип класса интерфейсом для насмешек.