6

thể trùng lặp:
Why do I need an IoC container as opposed to straightforward DI code?Những lợi thế của phụ thuộc Nghị quyết và IoC trong asp.net MVC

Tôi đọc một số bài viết về chủ đề này và tôi đã không tìm thấy bất kỳ lợi thế tuyệt vời. Ví dụ: mã này:

//some action in a controller 
//simplest solution: 
var repository = new EmployeeRepository(); 
var model = repository.ListAllEmployees(); 

bạn có thể nói: trong giải pháp này, bộ điều khiển/hành động phụ thuộc rất nhiều vào EmployeeRepository. Độ phân giải phụ thuộc là:

var repository = DependencyResolver.Current.GetService<IEmployeeRepository>(); 
var model = repository.ListAllEmployees(); 

tôi không tìm thấy nó bất kỳ tốt hơn so với một sau đây mà không bất kỳ độ phân giải phụ thuộc/IOC:

var model = Managers.EmployeeManager.ListAllEmployees(); 

Hope ai đó có thể cho tôi một số ý tưởng/links/bài viết trên chủ đề này.

Trả lời

5

Ưu điểm chính của đảo ngược điều khiển là tách. Bằng cách tách bạn cải thiện khả năng bảo trì. Bộ điều khiển/hành động của bạn phụ thuộc vào giao diện và việc thực hiện được đưa vào bộ điều khiển.

Độ phân giải phụ thuộc qua vùng chứa IoC đơn giản hóa logic tiêm phụ thuộc cho bộ điều khiển của bạn bằng cách định cấu hình vùng chứa. Trường hợp này thực sự trở nên rõ ràng là nếu một lớp phụ thuộc vào một dịch vụ, dịch vụ đó phụ thuộc vào các dịch vụ khác và các dịch vụ đó cũng có thể phụ thuộc vào nhiều dịch vụ hơn, thùng chứa sẽ xử lý độ phân giải phụ thuộc đó. Rất nhiều người có thể nói với bạn để thực hiện đảo ngược kiểm soát để có thể kiểm tra mã của bạn, đây không phải là những gì đảo ngược cung cấp kiểm soát, nó làm cho mã của bạn dễ kiểm tra hơn nhưng nó không phải là lý do chính.

10

Ví dụ của bạn với DependencyResolver không tốt hơn nhiều so với mã ban đầu của bạn, do đó, vâng .. không có nhiều lợi thế khi thực hiện điều đó.

Rất may, đó không phải là cách bạn phải làm. Thay vào đó, bạn sử dụng hàm tạo hoặc thuộc tính injection.

Tôi đồng ý với @adriaanp, kiểm tra đơn vị dễ dàng hơn chỉ là một lợi ích phụ của việc tiêm phụ thuộc. Lợi ích lớn nhất là nó khuyến khích kiến ​​trúc tự do phụ thuộc. Các lớp của bạn đứng một mình và không phụ thuộc vào việc thực hiện cụ thể (ngoài giao diện và yêu cầu)

Một lợi thế khác là thùng chứa IoC có thể kiểm soát tuổi thọ của các phụ thuộc của bạn. Giả sử bạn muốn một đối tượng tồn tại trong suốt vòng đời của yêu cầu trong trang web. Cũng giả sử rằng bạn muốn truy cập đối tượng này trong nhiều lớp khác nhau. Bạn có thể tạo đối tượng trong sự kiện tải trang của bạn, sau đó chuyển nó xung quanh tới mọi đối tượng bạn tạo cần. Tuy nhiên, điều này có nghĩa là bạn cần truyền nó cho các đối tượng không thực sự sử dụng nó, đơn giản chỉ vì chúng tạo ra các đối tượng cần nó (hoặc chúng tạo ra các đối tượng tạo ra các đối tượng cần nó, hoặc…).

Với tiêm phụ thuộc và thùng chứa IoC, vùng chứa kiểm soát thời gian tồn tại của đối tượng và giao dịch với việc tiêm vào đối tượng cần nó. Bạn không cần phải xây dựng điều này vào thiết kế của bạn. Bạn chỉ nhận được nó miễn phí.

Và cuối cùng, đối với sự cố kiểm tra.Khi bạn kiểm tra một cái gì đó, nếu nó có một mã hóa cứng mới trong đó, bạn không thể dễ dàng thay thế nó bằng một đối tượng giả để cung cấp dữ liệu thử nghiệm. Giả sử bạn muốn thử nghiệm một đối tượng tính toán một giá trị chính xác. Cho ăn dữ liệu thử nghiệm với các giá trị đã biết làm cho việc kiểm tra dễ dàng hơn.