
Trước khi đi vào rõ nét thì các bạn cần làm rõ một số điểm sau. IoC là design principle, nó không cần là một Pattern. IoC cứu các bạn thiết kế chương trình loosely copupled. để cho chương trình cũng trở thành dễ test, mở rộng and duy trì.
Bạn đang xem: Ioc là gì
Bài Viết: Ioc là gì

Tuy vậy để để cho chương trình loosely, các bạn phải kết hợp cả IoC and DIP chứ không chỉ dùng mỗi IoC.
Các bạn hãy xem các kiến trúc phổ cập như hình bên dưới:

Trong kiến trúc N-tier, ta sẽ tập trung vào BusinessLogic class and DataAccess class để hiểu về IoC. Ví dụ chương trình đc thiết kễ như sau:
public class CustomerBusinessLogic{ DataAccess _dataAccess; public CustomerBusinessLogic() { _dataAccess = new DataAccess(); } public string GetCustomerName(int id) { return _dataAccess.GetCustomerName(id); }}public class DataAccess{ public DataAccess() { } public string GetCustomerName(int id) { return “Dummy Customer Name”; // get it from DB in real app }}Về mặt thiết kế, code như thế hình như ngắn gọn, tuy vậy lại thêm một vấn đề là class CustomerBusinessLogic bị gắn chặt vào class DataAccess.
Giả sử nếu mà chương trình cần kết nỗi với nhiều data source khác nhau để lấy thông tin User thì các bạn sẽ phải sửa chữa class DataAccess này.
Xem thêm: Top 3 View Engine Phổ Biến Trong Nod Ejs Là Gì, Phần Mềm Mở File
Hoặc dễ chơi như việc chỉnh sửa class name cũng sẽ dẫn tới việc chỉnh sửa rất đông chỗ. Về căn bản thì đó là một thiết kế không rất tốt, khó mở rộng.
Để giải quyết vấn đề trên các bạn cần kết hợp IoC and DIP. Cảnh báo là IoC là tư tưởng thiết kế bởi vậy các bạn có rất đông phương pháp tiến hành triển khai, bạn cũng có thể free design. Như mình để cập ở trên cao các bạn sẽ apply từng step để imporve thiết kế trên:
Step 1: Create Simple Factory Class
public class DataAccessFactory{ public static DataAccess GetDataAccessObj() { return new DataAccess(); }}Hiện tại việc get object Data access sẽ trải qua class DataAccessFactory
public class CustomerBusinessLogic{ public CustomerBusinessLogic() { } public string GetCustomerName(int id) { DataAccess _dataAccess = DataAccessFactory.GetDataAccessObj(); return _dataAccess.GetCustomerName(id); }}Đó chính là tư tưởng áp dụng IoC, thay thế vì thẳng trực tiếp tạo được object DataAccess các bạn sử dụng class DataAccessFactory để tạo được object này. Tuy vậy để trọn vẹn loosely couple thì các bạn phải kết hợp DIP nữa.
Nhắc lại một chút DIP:
High-level modules should not depend on low-level modules. Both should depend on the abstraction. Abstractions should not depend on details. Details should depend on abstractions.
Nguyên lý số 1 nghe hình như dễ hiểu, còn số 2 khá là khó hiểu đúng không?
Abstraction là trừu tượng, một đồ gì đó không rõ nét. Với ví dụ ở trên cao thì class CustomerBusinessLogic là cái rất rõ nét. Vậy nguyên lý số 2 đề cập đến việc áp dụng interface and Abstraction class
Ok! dùng DIP vào ví dụ trên. Các bạn sẽ tạo được một Interface như sau:
public interface ICustomerDataAccess{ string GetCustomerName(int id);}Và chỉnh sửa class DataAccess and CustomerBusinessLogic class như sau:CustomerDataAccess
public class CustomerDataAccess: ICustomerDataAccess{ public CustomerDataAccess() { } public string GetCustomerName(int id) { return “Dummy Customer Name”; }}CustomerBusinessLogic
public class CustomerBusinessLogic{ ICustomerDataAccess _custDataAccess; public CustomerBusinessLogic() { _custDataAccess = DataAccessFactory.GetCustomerDataAccessObj(); } public string GetCustomerName(int id) { return _custDataAccess.GetCustomerName(id); }}Giải bày: Twitter FB LinkedIn Please enable JavaScript lớn view the comments powered by Disqus. Khang • 2021 • https://github.com/realchampionshipwrestling.com
Thể Loại: Share Kiến Thức Cộng Đồng
Bài Viết: Ioc Là Gì – Dependency Injection Và Inversion Of Control
Thể Loại: LÀ GÌ
Nguồn Blog là gì: https://realchampionshipwrestling.com Ioc Là Gì – Dependency Injection Và Inversion Of Control