Sobes.tech
Назад к вопросам
Senior
5

Как использовать контракты (интерфейсы) в сервисах? Dependency Injection в C#.

Компании, где спрашивали
Сбербанк

Ответ от нейросети

sobes.tech AI

В C# для реализации Dependency Injection (DI) обычно используют контракты в виде интерфейсов, чтобы отделить реализацию сервиса от его использования. Это повышает тестируемость, расширяемость и поддерживаемость кода.

Пример:

// Интерфейс (контракт)
public interface ILogger
{
    void Log(string message);
}

// Реализация интерфейса
public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

// Сервис, который зависит от ILogger
public class UserService
{
    private readonly ILogger _logger;

    // Внедрение зависимости через конструктор
    public UserService(ILogger logger)
    {
        _logger = logger;
    }

    public void CreateUser(string name)
    {
        // Логика создания пользователя
        _logger.Log($"User {name} created.");
    }
}

// Использование с DI контейнером (например, Microsoft.Extensions.DependencyInjection)
var services = new ServiceCollection();
services.AddTransient<ILogger, ConsoleLogger>();
services.AddTransient<UserService>();

var provider = services.BuildServiceProvider();
var userService = provider.GetService<UserService>();
userService.CreateUser("Alice");

Таким образом, сервисы зависят от абстракций (интерфейсов), а конкретные реализации внедряются через DI контейнер, что упрощает замену реализаций и тестирование.