Я прошу прощения, если это кажется еще одним повторением вопроса, но каждый раз, когда я нахожу статью, касающуюся этой темы, в основном это просто говорит о том, что DI. Итак, я получаю DI, но я пытаюсь понять потребность в контейнере IoC, в который, кажется, все входят. Действительно ли смысл контейнера IoC просто «автоматически разрешать» конкретную реализацию зависимостей? Может быть, мои классы, как правило, не имеют нескольких зависимостей, и, возможно, именно поэтому я не вижу ничего сложного, но я хочу убедиться, что я правильно понимаю полезность контейнера.
Обычно я разбиваю свою бизнес-логику на класс, который может выглядеть примерно так:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Таким образом, он имеет только одну зависимость, а в некоторых случаях он может иметь вторую или третью, но не так часто. Поэтому все, что вызывает это, может передать свое собственное репо или позволить ему использовать репо по умолчанию.
Что касается моего текущего понимания контейнера IoC, то все, что он делает - это разрешает IDataRepository. Но если это все, что он делает, то я не вижу в этом тонны ценности, поскольку мои операционные классы уже определяют запасной вариант, когда никакая зависимость не передается. Поэтому единственное другое преимущество, о котором я могу думать, это то, что если у меня есть несколько таких операций, как это использует тот же резервный репо, я могу изменить это репо в одном месте, которое является реестром / фабрикой / контейнером. И это здорово, но так ли это?
ConcreteRepository
и (2) вы можете предоставить дополнительные зависимости ConcreteRepository
(например, подключение к базе данных будет обычным).