Tôi biết câu hỏi này đã cũ nhưng tôi muốn thêm năm xu của mình,
Tôi nghĩ rằng tiêm phụ thuộc (DI) theo nhiều cách giống như Mô hình nhà máy (FP) có thể định cấu hình và theo nghĩa đó, bất cứ điều gì bạn có thể làm với DI, bạn sẽ có thể thực hiện với nhà máy đó.
Trên thực tế, nếu bạn sử dụng spring chẳng hạn, bạn có tùy chọn tự động cấp tài nguyên (DI) hoặc làm một cái gì đó như thế này:
MyBean mb = ctx.getBean("myBean");
Và sau đó sử dụng ví dụ 'mb' đó để làm bất cứ điều gì. Không phải đó là một cuộc gọi đến một nhà máy sẽ trả lại cho bạn một ví dụ sao ??
Sự khác biệt thực sự duy nhất tôi nhận thấy giữa hầu hết các ví dụ về FP là bạn có thể định cấu hình "myBean" trong xml hoặc trong một lớp khác và một khung công tác sẽ hoạt động như một nhà máy, nhưng ngoài điều đó là điều tương tự, và bạn có thể có một Nhà máy chắc chắn đọc tệp cấu hình hoặc thực hiện khi cần.
Và nếu bạn hỏi ý kiến của tôi (Và tôi biết bạn đã không), tôi tin rằng DI làm điều tương tự nhưng chỉ làm tăng thêm sự phức tạp cho sự phát triển, tại sao?
tốt, vì một điều, để bạn biết cách triển khai đang được sử dụng cho bất kỳ bean nào bạn tự động với DI, bạn phải tự đi đến cấu hình.
nhưng ... những gì về lời hứa mà bạn sẽ không phải biết về việc thực hiện đối tượng bạn đang sử dụng thì sao? pfft! nghiêm túc? khi bạn sử dụng một cách tiếp cận như thế này ... bạn có giống như vậy không khi viết bài thực hiện ?? và ngay cả khi bạn không, bạn gần như không thể nhìn vào cách thức thực hiện những gì nó phải làm ??
và đối với một điều cuối cùng, không có vấn đề bao nhiêu khung DI hứa với bạn rằng bạn sẽ xây dựng mọi thứ tách rời khỏi nó, không phụ thuộc vào các lớp của chúng, nếu bạn đang sử dụng một khung công tác bạn xây dựng mọi thứ, nếu bạn phải thay đổi cách tiếp cận hoặc khuôn khổ nó sẽ không phải là một nhiệm vụ dễ dàng ... EVER! ... Nhưng, vì bạn buil tất cả mọi thứ xung quanh khuôn khổ cụ thể đó thay vì lo lắng về giải pháp tốt nhất cho doanh nghiệp của bạn, thì bạn sẽ phải đối mặt với một vấn đề sinh học khi làm điều đó.
Trên thực tế, ứng dụng kinh doanh thực sự duy nhất cho cách tiếp cận FP hoặc DI mà tôi có thể thấy là nếu bạn cần thay đổi các triển khai đang được sử dụng trong thời gian chạy , nhưng ít nhất các khung tôi biết không cho phép bạn làm điều đó, bạn phải rời khỏi mọi thứ hoàn hảo trong cấu hình tại thời điểm phát triển nếu bạn cần sử dụng phương pháp khác.
Vì vậy, nếu tôi có một lớp thực hiện khác nhau ở hai phạm vi trong cùng một ứng dụng (giả sử, hai công ty đang nắm giữ) tôi phải cấu hình khung để tạo hai loại đậu khác nhau và điều chỉnh mã của tôi để sử dụng từng loại. Không giống như tôi sẽ viết một cái gì đó như thế này:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
giống như thế này:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Và điều này:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
Trong mọi trường hợp, bạn sẽ phải thay đổi một cái gì đó trong ứng dụng của mình, cho dù các lớp hoặc tệp cấu hình, nhưng bạn sẽ phải thực hiện lại nó.
Sẽ không tốt nếu làm điều gì đó như thế này:
MyBean mb = (MyBean)MyFactory.get("mb");
Và theo cách đó, bạn đặt mã của nhà máy để có được triển khai đúng trong thời gian chạy tùy thuộc vào doanh nghiệp người dùng đã đăng nhập ?? Bây giờ THAT sẽ hữu ích. Bạn chỉ có thể thêm một jar mới với các lớp mới và đặt quy tắc thậm chí có thể trong thời gian chạy (hoặc thêm tệp cấu hình mới nếu bạn để tùy chọn này mở), không thay đổi đối với các lớp hiện có. Đây sẽ là một nhà máy năng động!
Sẽ không hữu ích hơn việc phải viết hai cấu hình cho mỗi doanh nghiệp và thậm chí có thể có hai ứng dụng khác nhau cho mỗi doanh nghiệp ??
Bạn có thể nói với tôi, tôi không cần thực hiện chuyển đổi trong thời gian chạy, vì vậy tôi định cấu hình ứng dụng và nếu tôi kế thừa lớp hoặc sử dụng một triển khai khác, tôi chỉ cần thay đổi cấu hình và triển khai lại. Ok, điều đó cũng có thể được thực hiện với một nhà máy. Và thành thật mà nói, bạn làm điều này bao nhiêu lần? có lẽ chỉ khi bạn có một ứng dụng sẽ được sử dụng ở một nơi khác trong công ty của bạn và bạn sẽ chuyển mã cho một nhóm khác và họ sẽ làm những việc như thế này. Nhưng này, điều đó cũng có thể được thực hiện với nhà máy, và sẽ còn tuyệt vời hơn với một nhà máy năng động !!
Dù sao, phần bình luận nếu mở cho bạn để giết tôi.