2010-03-29 32 views
6

(Câu hỏi này không dựa trên một khuôn khổ IoC cụ thể, vì vậy các giao diện và loại trong các mẫu của tôi là các loại meta. Chỉ cần thay thế chúng bằng các loại thích hợp cho khung IoC yêu thích của bạn trong đầu.)Tiêm phụ thuộc: Làm thế nào để vượt qua hộp tiêm xung quanh?

Trong các phương pháp chính, tôi thường thiết lập vùng chứa của mình để làm một việc như sau:

static void Main() 
{ 
    IInjector in = new Injector(); 
    in.Register<ISomeType>().For<SomeType>(); 
    in.Register<IOtherType().For<OtherType>(); 
    ... 

    // Run actual application 
    App app = in.Resolve<App>(); 
    app.Run(); 
} 

Câu hỏi của tôi là, làm thế nào để bạn nhận được Injector gửi đi? Tôi đã bình thường chỉ cần đăng ký các vòi phun với chính nó và đã tiêm nó vào các loại mà chính họ sẽ làm tiêm, nhưng tôi không chắc chắn nếu điều này là đúng "mô hình".

Trả lời

14

Bạn không nên chuyển vật chứa xung quanh.

Thay vào đó, phương thức nhập/điểm của bạn yêu cầu vùng chứa cho các đối tượng cần khởi động - chẳng hạn như đối tượng/bean ứng dụng của bạn. Sau đó, vùng chứa trả về biểu đồ đối tượng đầy đủ được kết nối với App, cho phép bạn chạy app.Run(), với tất cả các phụ thuộc được thỏa mãn.

Đó là một chút chống mẫu cho các đối tượng cần lưu ý vùng chứa, hoặc đối với mỗi đối tượng yêu cầu vùng chứa phụ thuộc - nếu bạn làm như vậy thì bạn có không điều khiển ngược không phải là tiêm phụ thuộc - bạn vẫn có các đối tượng yêu cầu những gì họ cần, thay vì được đưa ra những gì họ cần.

+1

Được rồi, thế nào về điều này. Ứng dụng là một WinForm và có nút tạo và hiển thị biểu mẫu. Mỗi khi nút này được đẩy, một thể hiện mới của biểu mẫu này sẽ được tạo và hiển thị. Biểu mẫu này có các phụ thuộc, do đó, nó cần được giải quyết bằng Biểu mẫu ứng dụng cho mỗi lần khởi tạo. Giờ thì sao? – Alex

+2

@Alex: Trong trường hợp này, bạn có thể sử dụng "Nhà cung cấp" (các Nhà máy chuyên dụng) mà tôi đã đề cập trong bài đăng khác của tôi. Sự khác biệt giữa việc tiêm một nhà cung cấp, và tiêm toàn bộ kim phun là, điều này giới hạn mạnh mẽ các phụ thuộc gián tiếp "bí mật". IOW, nó không làm suy giảm Injector cho một Service Locator. –

+0

@chris_l: Vì vậy, sau đó "Nhà cung cấp" có thể giữ cho Injector xung quanh, phải không? Nếu không, chúng tôi vừa chuyển sự cố ở nơi khác. – Alex

2

Tốt nhất là tránh tiêm kim phun. Chỉ cần tạo các loại bạn cần, và sau đó bắt đầu thực hiện. Tôi đã viết một bài viết dài hơn một chút về chủ đề này: Accessing the DI container

Các vấn đề liên quan