Назад к вопросам
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 контейнер, что упрощает замену реализаций и тестирование.