2009-06-24 28 views
7

tôi chỉ cần nhét xung quanh với Google Guice cho Dependency Injection và bắt đầu tích hợp nó vào ứng dụng hiện có của tôi. Càng xa càng tốt. Tôi có nhiều lớp cần, bên cạnh các phụ thuộc của họ, Strings, DataSources, và cetera. Tôi biết có NamedBindings, nhưng tôi thực sự không muốn tạo chú thích cho mọi String đơn giản mà tôi phải truyền cho hàm tạo cho mỗi lớp. Sau đó, có một thứ gọi là AssistedInject, tạo ra các cài đặt Factory cho tôi. Wow, nhưng tôi vẫn phải xác định giao diện của nhà máy. Thats okay cho các lớp học DO CÓ phụ thuộc, nhưng những gì về lớp học này ví dụ:Tiêm phụ thuộc với Guice: Thứ gì đó không có trong bất kỳ hướng dẫn nào

public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

Có trường hợp tôi nghi ngờ làm thế nào để sử dụng Guice hoặc, nói chung, DI đúng cách. "Thường thì tôi nghe: Khung XYZ là mới mới." Nhưng điều này ngầm định rằng tôi phải tạo mỗi cá thể với khung DI.

Chỉ một trường hợp là bắt buộc

Nếu tôi chỉ cần một trường hợp của lớp học này thì sao? Lớp này hoàn toàn không phụ thuộc bên cạnh hai chuỗi. Hãy suy nghĩ về một Hook tắt máy sẽ được instanciated chỉ một lần và thông qua cho JVM như Shutdown Hook của tôi. Tôi có nên tạo trường hợp này với Guice không? Điều này trông rất câm với tôi, bởi vì không có gì để tiêm, nhưng tôi phải viết một giao diện nhà máy để vượt qua Hướng dẫn cả hai tham số và phải tạo một giao diện cho FooBarClass của tôi để sử dụng DI.

Nhiều trường hợp được yêu cầu

Điều tương tự cũng áp dụng cho trường hợp tôi cần nhiều phiên bản của lớp này. Không có phụ thuộc, nhưng tôi phải tạo ra một loạt các mã boilerplate để có được không có gì ra khỏi nó. Điều này có vẻ sai với tôi.

Vì vậy, làm thế nào tôi có nghĩa vụ phải sử dụng DI và/hoặc Guice?

Cảm ơn rất nhiều!

Trả lời

23

Nó có thể giúp phân chia phụ thuộc từ dữ liệu.

  • Phụ thuộc thường là dịch vụ: cơ sở dữ liệu, đồng hồ và RPC. Ngoài ra, tất cả mã ứng dụng được phân lớp trên các trang này: UserAuthenticator, PaymentHandlerEmailGateway.
  • Dữ liệu chỉ là: a Date, một Map<String,InetAddress> hoặc thậm chí là Customer. Đây là những đối tượng miền trong bộ nhớ đơn giản.

DI tự nhiên phù hợp nhất với mặt phụ thuộc của sự vật. Bạn nên tiếp tục sử dụng new cho các lớp mô hình dữ liệu của mình.

2

nếu bạn đang tạo nhiều trường hợp, chẳng hạn như Khách hàng cá nhân, bạn không cần phải tiêm chúng. điều có ý nghĩa là tạo ra một CustomerFactory có thể là phạm vi @Singleton có thể tạo ra các cá thể của Khách hàng với tất cả các phụ thuộc của nó.

2

Tiêm phụ thuộc nếu bạn muốn bỏ qua (cô lập) độ phức tạp của nó khi thử nghiệm một lớp cụ thể. Nếu lớp chỉ là một chủ dữ liệu, mã của nó là tầm thường (get, set, equals). Bạn không cần phải giả lập nó khi thử nghiệm lớp đích, vì vậy việc tiêm dữ liệu cá thể là quá mức cần thiết (và thường là khó).Nếu mã không nhỏ, thì lớp đó không chỉ là một người giữ dữ liệu, và bạn nên tiêm và thử nó trên các bài kiểm tra đơn vị.

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