Dependency Injection C# Là Gì

1. Dependency Injection là gì?

Lúc này, các xây dựng viên tốt lẫn lộn giữa các định nghĩa Dependency Inversion, Inversion of Control (IoC), Dependency Injection (DI). Ba khái niệm này tựa như nhau nhưng lại ko trọn vẹn như thể nhau.

Bạn đang xem: Dependency injection c# là gì


*
*
*

Nhìn hình trên, Tôi trả sử rằng dịp ban sơ vận dụng của bọn họ chỉ cần lấy công bố tự Squốc lộ database cùng hiện thị. vơi làm cho thường thì, chúng ta đang bước đầu viết class GetMessageFromDatabase. hàm Main sẽ Điện thoại tư vấn class DisplayMessage với class DisplayMessage buộc phải khởi tạo thành class GetMessageFromDatabase để lấy báo cáo từ Database. Vài tháng sau, họ cảm nhận đòi hỏi trường đoản cú quý khách hàng là người ta muốn đem báo cáo từ bỏ Database với XML tệp tin. Vậy là họ lại viết thêm class GetMessageFromXML để đưa lên tiếng từ XML tệp tin. Sau kia vài tháng, quý khách lại mong mỏi đem thêm thông tin trường đoản cú Text file và họ lại ngồi viết thêm class GetMessageFromText tương xứng.

Vấn đề tạo ra là những lần thêm một datasource new (database, xml, text file) bọn họ cần được viết một class để lấy dữ liệu khớp ứng, sau đó lại đề nghị sửa class DisplayMessage để nó khởi tạo và mang đúng datasource mình cần. Nếu là 1 trong những hệ thống lơn thì Việc biến hóa này đang là 1 trong những sự việc béo cùng đem đến nhiều phiền lành toái.

Mục đích của chúng ta nên là viết code theo một phương pháp nhưng mà lúc yêu cầu thêm vào một mối cung cấp dữ liệu bắt đầu, thì chỉ cần update lại lời điện thoại tư vấn datasource làm việc hàm Main thôi. Chúng ta không đề xuất đổi khác code ở class DisplayMessage để mê thích ứng cùng với những nhiều loại datasource mới được chế tạo.

Code ko dùng Dependency Injection:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1 class Program static void Main(string<> args) DisplayMessage dm = new DisplayMessage(); dm.ShowMessage(); public class DisplayMessage GetMessageFromDatabase Gmd; public DisplayMessage() Gmd = new GetMessageFromDatabase(); public void ShowMessage() Console.WriteLine(Gmd.GetMessage()); Console.ReadLine(); public class GetMessageFromDatabase public string GetMessage() //Pretover this comes from the database return "Hi from database"; Mọi sản phẩm OK, đưa sử vài mon sau họ cần đem mối cung cấp dữ liệu từ XML phụ thuộc vào tsi số sinh sống hàm Main. Vậy bọn họ cần được thêm class GetMessageFromXML vào code của mình. Đồng thời chúng ta cần được sửa lại một chút code ở hàm Main với class DisplayMessage. Bây giờ code của chúng ta đang nlỗi sau:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1class Programstatic void Main(string<> args)DisplayMessage dm = new DisplayMessage(args<0>.ToString());dm.ShowMessage();public class DisplayMessagestring source;public DisplayMessage(string s)source = s;public void ShowMessage()if (source.ToUpper() == "DATABASE")GetMessageFromDatabase Gmd = new GetMessageFromDatabase();Console.WriteLine(Gmd.GetMessage());Console.ReadLine();else if (source.ToUpper() == "XML")GetMessageFromXML Gmx = new GetMessageFromXML();Console.WriteLine(Gmx.GetMessage());Console.ReadLine();public class GetMessageFromDatabasepublic string GetMessage()//Pretover this comes from the databasereturn "Hi from database";public class GetMessageFromXMLpublic string GetMessage()//Pretover this comes from an XML filereturn "Hi from XML";Bây tiếng mang sử vài ba mon sau nữa bọn họ lại đề nghị mang tài liệu từ bỏ file Text phụ thuộc vào tmê man số truyền vào sinh sống hàm Main. Giờ mình làm cái gi đây? viết thêm class GetMessageFromTextFile, rồi sửa lại code của class DisplayMessage nửa hả?

Quý Khách bao gồm thấy sự phụ thuộc vào của class DisplayMessage Lúc thực thi ráng như thế nào chưa? Đó là nó buộc phải đổi khác phụ thuộc nguồn tài liệu được lấy.

Xem thêm: Biệt Phủ Giám Đốc Công An Tỉnh Yên Bái, Biệt Phủ Thiếu Tướng Đặng Trần Chiêu

Inversion of Control nỗ lực làm cho class DisplayMessage cùng các class tài liệu kéo ra hoàn toàn tự do cùng nhau. Inversion of Control (IoC) hay được tiến hành bởi việc vận dụng Dependency Injection (DI) như mình đã gồm kể ở đoạn tư tưởng.

Bây giờ bọn họ sẽ coi đoạn code bên trên dược áp dụng DI vào thì nó đang thế nào nhé.

Code dùng Dependency Injection:

Trong đoạn code bên dưới tôi vẫn dùng một trong 3 nhiều loại Dependency Injection chính là Constructor Injection.

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1public interface IGetDatastring GetMessage();class Programstatic void Main(string<> args)IGetData IG;string source = args<0>.ToString();if (source.ToUpper() == "DATABASE")IG = new GetMessageFromDatabase();else if (source.ToUpper() == "XML")IG = new GetMessageFromXML();else if (source.ToUpper() == "TEXT")IG = new GetMessageFromTextFile();elseIG = new GetMessageFromDatabase();//default mix to lớn databaseDisplayMessage dm = new DisplayMessage(IG);dm.ShowMessage();public class DisplayMessageIGetData IGLocal;public DisplayMessage(IGetData IG)IGLocal = IG;public void ShowMessage()Console.WriteLine(IGLocal.GetMessage());public class GetMessageFromDatabase : IGetDatapublic string GetMessage()//Pretover this comes from the databasereturn "Hi from database";public class GetMessageFromXML : IGetDatapublic string GetMessage()//Pretover this comes from an XML filereturn "Hi from XML";public class GetMessageFromTextFile : IGetDatapublic string GetMessage()//Pretend this comes from an Text filereturn "Hi from Text file";Nlỗi chúng ta thấy ở ví dụ bên trên, việc tiêm (injecting) vào những dựa vào (dependencies) trải qua constructor (), Tôi đã tách bóc class DisplayMessage với những class lấy dữ liệu (ex: class GetMessageFromDatabase ,…. ). Tôi có thể thêm nhiều class mới để đưa data nêu tôi hy vọng mà lại không nhất thiết phải sửa lại class DisplayMessage, miễn sao phần đa class kia cần được thừa kế (inherit) từ bỏ interface IGetData. Nghĩa là, hầu như vật dụng ở đây đã dựa vào vào chỉ 1 Interface. Đây phần lớn bọn họ mong muốn (giảm được sự dựa vào – reduce dependencies ).

Hy vọng sẽ giúp chúng ta nắm được cơ bạn dạng về định nghĩa với phương pháp sử dụng Dependency Injection.