Các khung tiêm phụ thuộc có gây ra rủi ro phụ thuộc không?


13

Tôi đã tái cấu trúc một hệ thống hiện có để sử dụng phương pháp tiêm phụ thuộc và công việc đó đã diễn ra suôn sẻ.

Sau một thời gian, tôi nhận thấy rằng một số lượng lớn các thư viện nội bộ đã trở nên phụ thuộc vào khung DI tôi đã sử dụng. Kết quả là toàn bộ dự án hiện phụ thuộc vào khuôn khổ của bên thứ ba này.

Tôi thấy một sự trớ trêu trong việc tách rời tất cả các phụ thuộc bằng cách làm cho chúng phụ thuộc vào một thư viện chia sẻ.

Phản ứng đầu tiên của tôi là tạo ra một thư viện bao bọc xung quanh khung phụ thuộc. Do đó, tôi có thể thay thế khung này nếu cần. Sau khi ước tính công việc liên quan, tôi nhận ra rằng API kết quả sẽ tương tự như khung hiện có và do đó làm cho việc thay thế nó trở nên khó khăn hơn. Thế là tôi từ bỏ ý tưởng.

Mối quan tâm của tôi là khung DI tôi đang sử dụng trở nên lỗi thời hoặc cần thay thế.

Có tồn tại một mô hình phát triển khi làm việc với DI làm giảm sự ghép nối giữa dự án và khung DI không?


4
Mẫu "không sử dụng khung DI". Mặc dù tôi phải tự hỏi liệu bạn có đang giải quyết vấn đề mà bạn không thực sự gặp phải không - khả năng bạn thay đổi khung DI như thế nào?
Oded

1
@Oded một khung DI tốt sẽ có thể hoạt động với mã trong suốt, nhưng có những trường hợp không thể. Sau đó, bạn phải sử dụng API DI trong các lớp học của mình. Trong những trường hợp đó, thật khó để chia sẻ hoặc thay đổi khung DI mà không cần thay đổi các lớp đó. Vì đây là lần đầu tiên tôi làm việc với khung DI đó. Tôi không chắc chắn nếu tôi cần phải thay thế nó.
Phản ứng

8
Hệ thống của bạn cũng phụ thuộc vào điện. Tôi đề nghị bạn tách rời đó đầu tiên.
Idan Arye

3
@MathewFoscarini Đây không phải là một mô hình chống sao? Bạn có thể làm điều đó, nhưng bạn không nên vì nó làm xáo trộn sự phụ thuộc.
maaartinus

2
@MathewFoscarini DIFramework.Get<IService>()không thực sự tiêm phụ thuộc; đó là một mẫu liên quan được gọi là Trình định vị dịch vụ. Rất nhiều người không thích Trình định vị dịch vụ vì nó kết hợp bạn với khung và vì nó quá dễ bị lạm dụng (như Singleton). Martin Fowler có một bài viết tuyệt vời về các mẫu này: martinfowler.com/articles/injection.html
Benjamin Hodgson

Câu trả lời:


8

Bạn hoàn toàn chính xác - sử dụng khung DI có thể sẽ khiến mã của bạn phụ thuộc vào điều đó. Trên thực tế, điều đó quá đáng ngạc nhiên, vì điều này thường đúng với mọi thư viện khung hoặc nền tảng khác, đặc biệt khi lib đó hỗ trợ dự án của bạn với một số tính năng chung được sử dụng ở mọi nơi trong mã của bạn. Ví dụ: khi bạn quyết định sử dụng khung UI hoặc khung Web nhất định, quyết định này khó có thể thay đổi sau đó ngay khi bạn xây dựng một số lượng mã nhất định dựa trên thư viện đó. Khi bạn quyết định sử dụng một lớp cụ thể (có thể không chuẩn) String, bạn không thể dễ dàng thay đổi quyết định đó sau này. Một quyết định như vậy là một kiến ​​trúc, nó giống như chọn một ngôn ngữ lập trình nhất định và cố gắng thay đổi quyết định đó sau khi bạn đã viết> 100K dòng mã.

Có tất cả các mã của bạn phụ thuộc vào một khung nhất định có thể không phải là vấn đề miễn là nó làm những gì bạn mong đợi từ nó và miễn là nó được duy trì đúng cách. Nhưng nó có thể trở thành một vấn đề nếu không phải như vậy. Có một số chiến lược làm thế nào để đối phó với tình huống đó:

  • chọn một khung từ một nhà cung cấp mà bạn tin tưởng rằng anh ta có thể cung cấp cho bạn các bản cập nhật và bản phát hành mới trong vài năm kể từ bây giờ

  • chọn một khung nguồn mở có đủ vài dòng mã (và giấy phép phù hợp), để bạn có thể tự mình bảo trì, do nhà cung cấp biến mất khỏi thị trường

  • viết khuôn khổ của riêng bạn

  • sống với tình huống miễn là nhà cung cấp có sẵn và khi anh ta thực sự biến mất, hãy chọn một khung khác và cố gắng tạo một bộ chuyển đổi mô phỏng khung cũ bằng cách sử dụng khung mới

Ý tưởng tạo ra một thư viện trình bao bọc trước đó hoàn toàn không mới, nhưng tôi hiếm khi thấy rằng nó hoạt động, vì bạn sẽ phải đưa ra các giả định cho một tình huống trong tương lai mà bạn không biết liệu nó sẽ đánh vào bạn và khi nào khuôn khổ "mới" sẽ như thế nào. Mặt khác, vài năm trước, chúng tôi đã trao đổi thành công một khung UI hoàn chỉnh trong dự án C ++ với ~ 120K dòng mã bằng cách áp dụng chiến lược bộ điều hợp tôi đã đề cập ở trên.


19

Tiêm xây dựng thông thường không yêu cầu một khuôn khổ nào cả. Điều duy nhất bạn mất đi là khả năng tập trung các phụ thuộc của bạn vào một tệp cấu hình.

Các thùng chứa DI là một mẫu "phần mềm doanh nghiệp", được sử dụng khi biểu đồ đối tượng rất lớn và phức tạp. Tôi nghi ngờ rằng 95% ứng dụng không yêu cầu nó.


5
Tôi đồng ý rằng các dự án nhỏ không yêu cầu nó, nhưng 95 +% dự án có thể thu lợi từ nó.
maaartinus

11
@maaartinus: Sự phức tạp thêm không cần thiết cho lợi ích tối thiểu.
Robert Harvey

1
Cái gì? Đây là số liệu thống kê của tôi trên mỗi lớp: 0,5 chú thích, dòng cấu hình 0,1. Vậy ý bạn là gì phức tạp ???
maaartinus

2
@RobertHarvey: mặc dù tôi đồng ý 100% với các tuyên bố của bạn ở trên, OP tuyên bố rằng ông đã giới thiệu khung DI. Nói với anh ấy "tốt hơn không" không thực sự là một câu trả lời cho câu hỏi của anh ấy.
Doc Brown

1
@maaartinus khung càng tự động hóa và càng nhiều thứ có thể tiêm thì càng phức tạp. Có các tệp cấu hình XML, hàm tạo của hàm tạo, hàm thuộc tính, chế độ đối tượng tự động, lệnh tiêm lười biếng, v.v .. vv .. các khung DI này có thể rất phức tạp.
Phản ứng

0

Tôi không nghĩ khung DI có thể thực sự trở nên lỗi thời bất cứ lúc nào sớm. Điều gì sẽ xảy ra để làm cho nó lỗi thời?

  • Một phát minh của một mô hình mới và thông minh hơn có thể? Tuy nhiên, nó sẽ trông giống như, nó sẽ đòi hỏi những thay đổi lớn hơn nhiều trong mã.
  • Một sự thay đổi trong ngôn ngữ có thể? Thậm chí tệ hơn.

Tôi nói rằng DI hiện tại đã đủ trưởng thành và tôi không biết nhiều chuyện xảy ra ở đó. Bạn chưa chỉ định ngôn ngữ của mình, vì vậy, nói về Guice , nó không gây khó chịu và hoạt động với các chú thích Java tiêu chuẩn (cũng sử dụng ngôn ngữ riêng của chúng cho những thứ không được chuẩn hóa, nhưng bạn hiếm khi cần nó). Nó có nguồn mở, được sử dụng rộng rãi và được cấp phép bởi Apache. Điều gì có thể là vấn đề?

Tôi khá chắc chắn rằng việc thay đổi khung DI sẽ dễ dàng hơn so với việc thay đổi bất kỳ thư viện nào khác (ví dụ: thay đổi UI có nghĩa là nhiều công việc hơn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.