水曜日, 1月 03, 2007

DI болон DI Container гэж юу вэ?

DI гэж юу вэ?
DI буюу Dependency Injection гэдэг нь ямар нэг объектод утга оноох үйлдэл юм. Үндсэндээ DI-ийн төрөл нь дараах 3 байх юм.
  1. Байгуулагчаар дамжуулан
  2. Setter функцээр
  3. Interface-ийг ашиглан
DI-г хэрэгжүүлэх, объект болон түүний хамаарлыг удирдах нь DI Container юм.
Объект нь шаардлагатай зүйлийг өөрөө авах бус DI Container дамжуулах юм. Ямар объектод юуг дамжуулах вэ гэдэг нь DI Container-н тохиргооны файлд заагдана.

DI-ийн үндсэн үйлдэл
Хялбархан кодоор жишээ авч DI-ийн үндсэн үйлдлийг үзье.
Доорх код нь, Hello класс нь ConsolePrinter-ийг ашиглаж дэлгэцэнд “Hello” гэж хэвлэх програм юм. Ажиллуулах нь Main классын main method юм. Эхлээд DI-г хэрэглээгүй жишээ.

Source code 1-1
Main.java
public class Main {
public static void main(String a[]) {
Hello hello = new Hello();
hello.sayHello();
}
}

Hello.java
public class Hello {
private ConsolePrinter printer = new ConsolePrinter(“say: ”);
Public void sayHello() {
Printer.print(“hello”);
}
}

ConsolePrinter.java
Public class ConsolePrinter {
Private String lineHead;
Public ConsolePrinter(String lineHead) {
This.lineHead = lineHead;
}
Public void print(String messange) {
System.out.println(lineHead + message);
}
}

DI-г хэрэглэвэл
Source code 1-2

Main.java
public class Main {
public static void main(String a[]) {
Printer printer = new ConsolePrinter(“say: ”);
Hello hello = new Hello(printer);
hello.sayHello();
}
}

Hello.java
public class Hello {
private Printer printer;
public Hello(Printer printer) {
this.printer = printer;
}
public void sayHello() {
printer.print(“hello”);
}
}

Printer.java
public interface Printer {
public void print(String message);
}

ConsolePrinter.java
Public class ConsolePrinter {
Private String lineHead;
Public ConsolePrinter(String lineHead) {
This.lineHead = lineHead;
}
Public void print(String messange) {
System.out.println(lineHead + message);
}
}

Source code 1-2ийн жишээнд DI нь, main method-д Hello-ийн instance-д ConsolePrinter-ийн instance-ийг дамжуулж байгаа явдал юм.
Printer гэдэг Interface-ийг хэрэглэхэд Hello класс нь хэрэгжүүлэгч класс(ConsolePrinter)-д хамаарахгүй болж байна. Хэрэв текст файлруу бичдэг TextFilePrinter гэх классыг хэрэглэхээр өөрчилвөл, өөрчлөх шаардлагатай нь Main класс л юм. DI Container-ийг хэрэглэх тохиолдолд тохиргооны файлыг зөвхөн өөрчлөх ба эх кодыг өөрчлөх шаардлагагүй юм.

DI-аар бүх классуудын хамаарлыг удирдаад явахад нэлээн төвөгтэй Application болно. Иймээс компонентыг оруулж ирэх хэрэгтэй. Компонент нь application болон классуудын дунд байрлах ба application нь компонентуудаа комбинац хийж үүсгэх, харин компонент нь классуудаа комбинац хийж үүсгэх гэсэн хэлбэртэй болох юм.

DI Container-ийн үүрэг
1. Компонентын instance-г үүсгэх
2. Үүссэн байгаа instance-д бусад instance-г дамжуулах
3. Хийх арга болон комбинацыг DI Container-ийн тохиргоогоор удирдах

1 ба 2 нь DI-г гүйцэтгэлийг харуулж байна. Компонентын instance-г үүсгэх үед тохиргооны дагуу DI-ийн анхны утга олгох процессыг явуулна.
3 дахь нь DI container-ийн үүргийн чухал хэсэг юм. Тохиргоо нь ерөнхийдөө DI container-ийн тохиргооны файлаар явагдана.

0 件のコメント: