Не понятен смысл DI

320
19 января 2017, 01:59

Мне не до конца понятен смысл использование DI (например autofac). Возможно, я не правильно трактую его смысл из-за неверной области применения.

Контекст задачи следующий: необходимо внедрить autofac модуль в систему тестирования. Собственно проблема, зачем мне писать код с разрешением зависимостей через тот же autofac если могу явно создавать объекты и передовать их в конструктор.

К примеру, есть ApiController, у него в конструкторе куча аргументов типа пользовательского контекста, менеджера регистрации, менеджера для отправки смс и т.д. Все эти объекты в свою очередь тоже достаточно сложно инициализируются. К примеру:

Вариант с Autofac

ISomeClassInterface someClass;
var builder = new ContainerBuilder();
builder.RegisterType<SomeService>();
var container = builder.Build();
someClass = new SomeClass(container.Resolve<SomeService>();

Вариант без Autofac'a

ISomeClassInterface someClass;
ISomeService service = new SomeService(some arguments...);
someClass = new SomeClass(service);
Answer 1

Вы сами ответили на свой вопрос: "Все эти объекты в свою очередь тоже достаточно сложно инициализируются". Чем сложнее, тем проще ошибиться. Безусловно, можно не использовать никакой DI. Но, во-первых, DI упрощает инициализацию объектов. Во-вторых, DI упрощает подмену объектов. Например, вы захотите использовать другой менеджер регистрации. Без DI придется менять код в нескольких местах, с DI - в одном.

Сравните:

A a = new A(new B(new C()), new D(new E())...);

И как-то условно

A a = container.Resolve<A>();
READ ALSO
CQRS. Что является Command?

CQRS. Что является Command?

Какова область ответственности command? Например, регистрация пользователя :

302
Использование RegExp в JSON Schema

Использование RegExp в JSON Schema

Имеется JSON Schema, которая описывает массив директорий в JSON файлеДиректории могут содержать абсолютные локальные пути, либо быть в UNC формате...

369
Как распарсить BBCODE

Как распарсить BBCODE

Всем приветПодскажите как распарсить BBCODE, пример

365