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);
        }
    }
}
 MSJO.kr