DI, Dependecy Injection - это сам процесс внедрения зависимостей (например, когда ты зависимости через конструктор получаешь)
Пример:
class User
{
IService _service;
// DI
User(IService service)
{
_service = service;
}
}
DI-Container - это специальный контейнер, который может необходимую зависимость предоставить. Сначала ты в него регистрируешь все зависимости, а потом вызываешь метод по типу
.getService("UserService")
и он сам понимает какой сервис ты хочешь, какая у него реализация и как его создать (возможно для него нужны другие зависимости)
Пример
// DI-контейнер
var container = new DependencyContainer();
container.Register(typeof(IService), new ConcreteService());
var service = container.Get<IService>();
Сервис-локатор - это (анти) паттерн, когда, грубо говоря, у тебя есть статический класс этого DI контейнера, к которому обращаются все сервисы. Т.е. вместо того, чтобы использовать тот же самый DI или передавать интерфейс DI контейнера они напрямую обращаются к конкретному DI-контейнеру. Так делать не надо - будут трудности с тестированием, обновлением и всем сопутствующим
Пример
// Сервис-локатор
class ServiceRegistry
{
IService Service;
static IService GetService()
{
return Service;
}
}
class User
{
void DoSomething()
{
var service = ServiceRegistry.GetService();
service.MakeStuff();
}
}