간단 한 의존 거꾸로 / 의존 주입 (Dependency Injection) 의 예

간단 한 의존 거꾸로 / 의존 주입 (Dependency Injection) 의 예
1.
메 일 발송 프로그램
class MailService
   {
     public void SendEmail(string address, string subject, string
       body)
     {
       var mail = new MailMessage();
       mail.To.Add(address);
       mail.Subject = subject;
       mail.Body = body;
       var client = new SmtpClient();
       // Setup client with smtp server address and port here
       client.Send(mail);
} }

2.
로그 기능 추가
class MailService
{
  public void SendMail(string address, string subject, string
    body)
  {
    Console.WriteLine("Creating mail message...");
    var mail = new MailMessage();
    mail.To.Add(address);
    mail.Subject = subject;
    mail.Body = body;
    var client = new SmtpClient();
    // Setup client with smtp server address and port here
    Console.WriteLine("Sending message...");
    client.Send(mail);
    Console.WriteLine("Message sent successfully.");
} }

현재 MailService 는 메 일과 기록 로 그 를 보 내 는 두 가지 직책 을 가지 고 있 습 니 다.
3.
로그 의 실현 세부 사항 을 분리 하 다.
class MailService
   {
     private ConsoleLogger logger;
     public MailService()
     {
       logger = new ConsoleLogger();
     }
     public void SendMail(string address, string subject, string
       body)
     {
       logger.Log("Creating mail message...");
       var mail = new MailMessage();
       mail.To.Add(address);
       mail.Subject = subject;
       mail.Body = body;
       var client = new SmtpClient();
       // Setup client with smtp server address and port here
       logger.Log("Sending message...");
       client.Send(mail);
       logger.Log("Message sent successfully.");
} }
class ConsoleLogger
   {
     public void Log(string message)
     {
       Console.WriteLine("{0}: {1}", DateTime.Now, message);
     }
}

이제 로그 기능 의 변경 을 ConsoleLogger 로 분리 할 수 있 습 니 다.예 를 들 어 윈도 이벤트 로그 방법 으로 로 그 를 기록 합 니 다.
4.
지금 은 개발 환경 과 생산 환경 에 따라 각각 다른 Logger 를 사용 해 야 한다 고 가정 합 니 다.예 를 들 어 개발 환경 용 ConsoleLogger, 생산 환경 용 EventLogger 등 이다.
class EventLogger
   {
     public void Log(string message)
     {
       EventLog.WriteEntry("MailService", message);
     }
}

인터페이스
interface ILogger
   {
     void Log(string message);
   }
class ConsoleLogger:ILogger
   {
     public void Log(string message)
     {
       Console.WriteLine("{0}: {1}", DateTime.Now, message);
     }
}
class EventLogger:ILogger
{
  public void Log(string message)
  {
    EventLog.WriteEntry("MailService", message);
  }
}

구조 함수 인 자 를 통 해 MailService 는 구체 적 인 Logger 류 에 의존 하지 않 습 니 다. 로그 기능 에 대한 수정 은 MailService 에 영향 을 주지 않 습 니 다.
public MailService(ILogger logger)
   {
     this.logger = logger;
   }
MailService 는 Logger 류 의 생 성에 관심 이 없고 로그 류 가 제공 하 는 기능 만 사용 합 니 다.
internal class Program
   {
     private static void Main(string[] args)
     {
       var mailService = new MailService(new EventLogger());
       mailService.SendMail("[email protected]", "My first DI
         App", "Hello World!");
     }
}

좋은 웹페이지 즐겨찾기