2010-09-29 28 views
7

Tôi đang tạo thư viện sẽ được bao gồm làm bình, vì vậy nó sẽ không chứa phương pháp chính. Tôi tự hỏi thực hành tốt nhất cho bootstrapping Guice trong trường hợp này là gì. Tôi có một singleton cấp cao nhất.Sử dụng Guice mà không có phương pháp chính

public class TestManager 
{ 
    private TestManager() 
    { 
    } 

    public static TestManager getInstance() 
    { 
     // construct and return singleton 
    } 

    public void createSomeObjects() 
    { 
    } 

} 

Tôi nên bootstrap Guice ở đâu? Tôi đã nghĩ rằng trong constructor mà tôi có thể gọi Guice.createInjector (new Module()); nhưng nó sẽ không tiêm bất kỳ đối tượng nào được tạo trong createSomeObjects().

Có cách nào phổ biến để làm điều này khi bạn không có phương thức chính()?

Chúc mừng.

Trả lời

8

Giống như cấu hình đăng nhập, nếu điều này là một thư viện đúng thì lựa chọn của bạn là khá nhiều này:

  • Nói với người sử dụng thư viện mà họ có trách nhiệm bootstrapping Guice mình.
  • Cung cấp một thư viện khởi tạo phương pháp rằng sẽ chăm sóc của bootstrapping Guice nếu họ muốn sử dụng thư viện của bạn

Đang cố gắng để làm cho siêu thông minh thư viện để làm tự cấu hình thường kết thúc với hơi cứng nhắc, khó để kiểm tra phân cấp lớp.

+5

Cung cấp cho khách hàng mô-đun Guice có thể hoạt động tốt. –

+1

+1 để tự cấu hình siêu thông minh. Chỉ cần nghĩ rằng nó xấu đi với Apache Commons Logging. –

+0

@Jesse, tôi chưa bao giờ thấy các thư viện sử dụng Guice nội bộ thực sự phơi bày nó cho người dùng cuối. Ví dụ Maven và JIRA sử dụng IoC đằng sau hậu trường nhưng chúng tiêm vào các lớp của bạn mà bạn không biết chúng đang sử dụng chúng. Hiển thị Guice âm thanh sạch hơn (nếu người dùng cảm thấy thoải mái với Guice) nhưng tôi sợ nó có thể đe dọa người dùng đi (tại sao người khác không làm điều đó?). – Gili

0

Đây không phải là những gì bạn nên làm gì, nhưng những gì bạn có thể làm:

Hãy lớp quan trọng trong thư viện của bạn mở rộng hoặc tham khảo một lớp học mà khởi tất cả mọi thứ trong một khối tĩnh. Đây là một hack rất bẩn, nhưng nếu bạn chắc chắn rằng api của bạn không thể được truy cập mà không có trình nạp lớp tải lớp khởi tạo của bạn, bạn nên ở bên an toàn.

Bạn có thể làm cho nó sạch hơn một chút nếu bạn sử dụng AspectJ và tiêm một thành viên riêng của kiểu khởi tạo vào tất cả các lớp trong thư viện của bạn (mà không cần chạm vào mã java), nhưng nó vẫn sẽ là một hack.

0

Nếu bạn chỉ sử dụng Guice trong phạm vi thư viện của mình chứ không phải cho toàn bộ ứng dụng thì bạn có thể sử dụng khối tĩnh trong lớp TestManager.

Chiến lược này giả định rằng ứng dụng sẽ gọi TestManager.getInstance() tại một số thời điểm và đó là điểm nhập duy nhất vào API của bạn.

@Singleton 
class TestManager { 

    private static final TestManager INSTANCE; 

    static { 
    INSTANCE = Guice.createInjector(new Module()).getInstance(TestManager.class); 
    } 

    private TestManager() { 
    } 

    public static TestManager getInstance() { 
     return INSTANCE; 
    } 

    @Inject 
    public void createSomeObjects(YourDependencies ...) { 
    // Do something with dependencies 
    } 
} 
Các vấn đề liên quan