DI(Dependency Injection)도 디자인 패턴의 일종이다. A 클래스의 함수를 B 클래스에서 호출하기 위해서는 클래스 의존성을 가져야 한다. 하나의 클래스를 수정할 때 다른 하나의 클래스도 수정해야 하는 높은 결합도(coupling) 문제가 발생한다1. 이러한 의존성을 제거하기 위해 의존성 제거 후 다시 의존성을 주입해주는 것이다2.
클래스의 생성자, Interface를 사용하여 Interface에만 의존하게 하면 Interface만 있으면 된다. 이런 결과로 다른 개발자가 어떤 클래스를 완성할 때까지 기다릴 필요가 없음으로 개발속도가 빨라질 수 있다.
아래의 예제3는 C# Console Application이며 .NET 버전은 5.0을 사용했다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용하는 것이다.
DI Example
using System;
namespace ExamDI
{
internal class Program
{
private static void Main()
{
string loggerType = "database";
ILogger logger = loggerType switch
{
"database" => new DatabaseLogger(),
_ => new TextLogger(),
};
LogManager logManager = new(logger);
try
{
throw new DivideByZeroException();
}
catch (Exception ex)
{
logManager.Log(ex.Message);
}
}
}
interface ILogger
{
void Log(string message);
}
class LogManager
{
private readonly ILogger _logger;
public LogManager(ILogger logger)
{
_logger = logger;
}
public void Log(string message)
{
_logger.Log(message);
}
}
class TextLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine("Log Text: " + message);
}
}
class DatabaseLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine("Log Database: " + message);
}
}
}