2011-09-27 6 views
6

Tôi nghiêm túc bắt đầu nghĩ rằng việc sử dụng container IoC kích thích để tạo ra các giải pháp overdesigned (ít nhất nó kích thích tôi để cố gắng sử dụng các tính năng không cần thiết khác nhau :).Antipatterns sử dụng vùng chứa IoC. Tại sao container IoC quá phức tạp và được sử dụng như vậy "ưa thích" cách?

Đó là thời gian để đồng bộ hóa danh sách "IoC" antipatterns của tôi với cộng đồng của một người ..

kinh nghiệm ngắn của tôi nói rằng nó là hoàn toàn đủ để gọi phương thức Giải quyết một lần cho mỗi ứng dụng lúc khởi động để giải quyết một số độc thân cơ sở hạ tầng và bắt đầu với chúng "nhà máy của đối tượng thoáng qua" có thể tạo ra "các nhà máy hạt thời gian sống nhỏ hơn" mới. Thậm chí để làm cho các nhà máy này an toàn (ví dụ, tạo một thể hiện cho mỗi luồng) dễ dàng đạt được bằng cách thêm 10 dòng mã vào nhà máy ... Tuy nhiên, các nhà máy này đơn giản hơn nhiều sau đó "tích hợp thư viện với công cụ IoC". Đánh chặn? Chỉ cần tạo trình bao bọc của riêng bạn ... Các trình quản lý thời gian sống/các chiến lược phụ thuộc/các vùng chứa cha mẹ? Gọi Resolve chỉ một lần tại bootstrapper và bạn sẽ không nghĩ về điều đó.

Bạn có thể giúp tôi hiểu lý do tại sao nhà phát triển gọi Resolve nhiều lần trên các lớp ứng dụng khác nhau (bằng cách chuyển vùng chứa hoặc chuyển giao đại lý cho vùng chứa) và sau đó có rất nhiều điều cần suy nghĩ? Tôi thực sự lo lắng rằng tôi nhớ cái gì đó.

+2

Điểm tốt. Bạn có thể de-verbositize này? –

Trả lời

0

antipattern khác trong mắt tôi đang thúc đẩy việc khởi tạo container "sâu hơn" bootsrapper sau đó thực tế.

Ví dụ Unity and WCF recommendations

Bootstrapper trong ứng dụng WCF là các nhà xây dựng dịch vụ, sau đó chỉ cần đặt khởi container để xây dựng. Tôi không hiểu lý do để khuyên bạn nên đi lập trình wcf sevice behaiviors và custome sevice host factory: nếu bạn muốn có "IoC container free" bootstrapper - nó là vô lý, nếu bạn cần có "IoC container free" thực hiện hợp đồng dịch vụ - chỉ cần tạo thứ hai "IoC container miễn phí" thực hiện hợp đồng dịch vụ.

1

Đọc This

Rõ ràng đã xảy ra sự cố. Thư viện mới không được mang thêm mã phức tạp.

1

Một số loại IoC có khả năng chống mẫu hoặc có thể trong một số trường hợp. Ví dụ: service locator antipattern. Nhưng nếu bạn đang sử dụng tiêm constructor ở đầu của ứng dụng của bạn - và chỉ có - sau đó nó nên không dẫn đến một anti-pattern.

Tiêm giao diện vùng chứa DI trong một lớp là sử dụng sai cú pháp của hàm tạo. Nếu DI không phải là một phần của logic kinh doanh của lớp học của bạn, nó không nên biết hoặc phụ thuộc vào DI container cũng không nên phụ thuộc vào IKitchen. Nó chỉ tốt để tiêm container DI của bạn trong một số loại trợ giúp hoặc dịch vụ làm việc cùng với container tiêm phụ thuộc của bạn, bởi vì mục đích của nó là làm việc với hoặc xung quanh DI container. Các ví dụ trong các liên kết bạn đưa ra là lạm dụng IoC. Nó không có nghĩa là IoC nói chung là một anti-pattern.

Tôi nghĩ câu hỏi chính xác sẽ là "Có thể xây dựng tiêm là một mô hình chống?". Cho đến nay tôi chưa bao giờ gặp phải bất kỳ tình huống nào hoặc nhìn thấy bất kỳ ví dụ nào, vì vậy tôi sẽ nói "không", cho đến khi tôi đối mặt với tình huống như vậy.

2

Khi không rõ với tôi cách sử dụng thùng chứa IoC, tôi quyết định ngừng sử dụng nó, vì tôi nghĩ chỉ là một sự quá mức đối với việc tiêm phụ thuộc đơn giản.

Đúng là mặc dù không có IoC có thể rơi vào trường hợp quá liều. Một thời gian trước, tôi đọc một số bài viết từ tác giả của ninject đã mở tâm trí của tôi.

Như bạn đã biết, chỉ nên sử dụng đầu phun bên trong gốc ngữ cảnh. Tuy nhiên, để tránh tiêm quá liều, tôi quyết định giới thiệu một quy tắc ngoại lệ cho các nhà máy được tiêm.

Trong khuôn khổ của tôi, các nhà máy (và chỉ các nhà máy) mới có thể sử dụng bình chứa vòi phun. Các nhà máy được liên kết trong thùng chứa trong thư mục gốc và do đó có thể được tiêm. Các nhà máy trở thành phụ thuộc hợp lệ và được sử dụng để tạo ra các đối tượng mới bên trong các đối tượng khác, sử dụng các thùng chứa vòi phun để tạo điều kiện tiêm phụ thuộc.

+0

Có! Tôi hoàn toàn đồng ý với bạn ở đây. Cho phép các nhà máy sử dụng các container là OK, bởi vì những gì thay thế? "Làm mới" lên các vật thể một cách thủ công lần nữa? Tôi nghĩ mọi người quá hung hăng về lý thuyết đằng sau những khái niệm này hơn là sử dụng chúng như là các công cụ _productivity_. –