9

Tôi tự hỏi làm thế nào tôi nên lưu trữ/tham chiếu các thùng chứa phụ thuộc của tôi tiêm (s). Có thể có một thùng chứa là một thuộc tính tĩnh trên một lớp tĩnh không? Hoặc tôi nên có container là một biến thể hiện trên ứng dụng? Tôi đang tự hỏi những ưu và nhược điểm của mỗi tùy chọn là gì, và thực hành tốt nhất cho điều này trong các ứng dụng web, mvc, giao diện điều khiển và cửa sổ là gì?Tôi nên lưu trữ tham chiếu đến vùng chứa DI ở đâu?

+0

trùng lặp: http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ câu hỏi/277438/abstracting-ioc-container-đằng sau-một-singleton-làm-nó-sai http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ câu hỏi/367178/usage-of-ioc-containers-specific-windsor http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line –

+1

Cảm ơn tất cả mọi người! Xin lỗi cho tất cả các bản sao - Tôi đã đoán đây là một sự lừa đảo nhưng không chắc chắn làm thế nào để cụm từ câu hỏi của tôi để tìm thấy chúng. –

Trả lời

5

Tôi khuyên bạn nên lưu trữ dưới dạng biến mẫu trên ứng dụng. Sử dụng một thuộc tính tĩnh - làm cho nó trở thành một singleton có thể truy cập toàn cầu - ẩn phụ thuộc vào ứng dụng của bạn trên đó, đó là một trong những thứ bạn đang cố gắng tránh xa bằng cách sử dụng một thùng chứa phụ thuộc tiêm ở nơi đầu tiên! Đã nói rằng, nếu khung làm việc của bạn gây khó khăn cho bạn để truy cập cá thể ứng dụng của bạn, nó sẽ không phải là kết thúc của thế giới để sử dụng một biến tĩnh.

1

Tôi đồng ý với ông Sternal về vấn đề này. Một điều cần xem xét là một số container DI thực hiện IDisposable, vì vậy bạn có thể muốn vứt bỏ các container trên chấm dứt chương trình bình thường. Xem How do you reconcile IDisposable and IoC?

Cũng lưu ý rằng tốt nhất là nên tránh phụ thuộc tán xạ vào vùng chứa DI trong suốt đơn đăng ký của bạn. Nói cách khác, cố gắng tránh làm cho vùng chứa có sẵn trên toàn cầu (Singleton, thuộc tính tĩnh hoặc thậm chí được tiêm) để sử dụng làm Service Locator.

Thay vào đó, bạn có thể sử dụng khả năng của vùng chứa để giải quyết các phụ thuộc của phụ thuộc. Ví dụ, bạn có thể tạo container khi khởi động ứng dụng và sử dụng nó để xây dựng Mô hình của bạn (trong MVC). Mô hình có thể phụ thuộc vào một kho lưu trữ và một dịch vụ web. Kho lưu trữ có thể phụ thuộc vào trình ghi nhật ký. Vùng chứa sẽ giải quyết tất cả những thứ này khi mô hình được xây dựng. Nếu mô hình của bạn cần tạo ra các cá thể phụ thuộc khi đang bay, hãy tiêm một nhà máy vào đó.

+1

Đồng ý, và tôi thích cách một tấm áp phích đặt nó vào một trong những mánh lới mà Mauricio đào lên: "Đặt container IOC ở mức cao nhất/điểm vào trong quá trình và sử dụng nó để tiêm phụ thuộc vào mọi thứ bên dưới nó." (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@ Jeff - Trích dẫn hay; Ngắn gọn và đúng trọng tâm. Ngoài ra còn có một câu trả lời tuyệt vời của Thorsten Lorenz trong liên kết này (cũng từ Mauricio): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

Nếu bạn đặt thùng chứa ở mức cao nhất, điều này có lẽ tạo ra một nhu cầu để giữ một tham chiếu đến hội đồng cấp thấp nhất của bạn mà đòi hỏi phải tiêm (truy cập dữ liệu có lẽ). Điều này irks tôi một chút :( – dougajmcdonald