IoC là gì? Các giải pháp IoC và cách sử dụng UnityContainer trong C#

Giả thuyết vấn đề :
CASE :
        + Đối với các dự án vừa và lớn , với rất nhiều  class và interface  có sự liên hệ cực kì phức tạp giữa các đối tượng trong hệ thống. Như vậy khi ta khởi tạo các object và các service sẽ rất rườm rà và chi tiết.
FACT:
        + Việc bạn code sẽ đòi hỏi chuẩn mực nhất định, một số vấn đề sẽ gặp khi khởi tạo 2 object phụ thuộc với nhau như sau:
IA a = new A();
IB b = new B(a); 
Từ ví dụ trên ta thấy, mỗi khi cần khởi tạo object B ta luôn cần khởi tạo object A trước. Với số lượng object phụ thuộc ngày càng tăng, việc này sẽ dẫn đến khó khăn nhất định.
Vậy có cách nào để đơn giản hóa việc này?
Solution: với IoC, ví dụ trên có thể đơn giản hơn như sau:
IB b = ServiceLocator.Get();  
ServiceLocator sẽ tự biết cách khởi tạo object A và invoke hàm khởi tạo của B.
ServiceLocator làm điều đó bằng cách nào? Tất nhiên chúng ta sẽ phải cấu hình để ServiceLocator làm đc điều đó, thông qua viết code hoặc file cấu hình (tùy vào khả năng hỗ trợ của tool)
Sức mạnh của IoC nằm ở khả năng reusable và flexible, cùng 1 dòng khởi tạo như trên, code thực thi trong Runtime có thể khác nhau nếu ta thay đổi cấu hính, điều này khiến ứng dụng trở nên uyển chuyển và dễ test.
Vậy tóm lại, IoC là gì?
In software engineering, inversion of control (IoC) is a programming technique, expressed here in terms of object-oriented programming, in which object coupling is bound at run time by an assembler object and is typically not known at compile time using static analysis.
Lợi ích của IoC như sau (từ wikipedia):
  • There is a decoupling of the execution of a certain task from implementation.
  • Every module can focus on what it is designed for.
  • Modules make no assumptions about what other systems do but rely on their contracts.
  • Replacing modules has no side effect on other modules.
Các lợi ích trên của IoC có thể dễ dàng suy luận từ khả năng cấu hình mà IoC mang lại. Dưới đây là một ví dụ về cấu hình của IoC sử dụng StructureMap (lấy từ mã nguồn SharpLite):
public static void Initialize() {
Container container = new Container(x => {
x.For()
.Singleton()
.Use(() => NHibernateInitializer.Initialize().BuildSessionFactory());
x.For().Use();
x.For(typeof(IRepository<>)).Use(typeof(Repository<>));
x.For(typeof(IRepositoryWithTypedId<,>)).Use(typeof(RepositoryWithTypedId<,>));
});

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
}
hiểu nôm na là như sau :
- Tôi cần đồ uống (interface X)
 - Xin hỏi anh cần đồ uống loại nào? cafe (A:X), trà (B:X), ...?
 - Buổi sáng tôi muốn uống cafe, còn buổi trưa thì uống trà  
Như vậy, mỗi khi bạn gọi đồ uống ở dịch vụ nơi đó, bạn ko cần nhắc lại yêu cầu của mình nữa
Các tools IoC phổ biến

Có rất nhiều (nguồn từ Hanselman):
Here’s what I’ve got so far. What am I missing?
Cách dùng UtityContainer....continue!

Không có nhận xét nào :

Đăng nhận xét