2010-06-20 25 views
7

Tôi hy vọng sẽ xác định lại hoặc cập nhật một số ràng buộc trong một Mô-đun mà lần lượt được sử dụng bởi một Injector. Tôi nhận ra rằng Mô-đun là không thay đổi và một khi một ràng buộc được hút và tiêm định nghĩa của nó không thể thay đổi cho tất cả các mục đích thực tế.Cách tiếp cận tốt nhất để thay đổi (thêm/gỡ bỏ các ràng buộc) một vòi phun Guice trong khi duy trì trạng thái

Tôi muốn thêm/thay đổi/loại bỏ các ràng buộc trong khi vẫn giữ các đĩa đơn đã sống trong một Injector. Thay đổi là một trường hợp đơn giản vì người ta có thể đạt được hiệu ứng này bằng cách sử dụng một Nhà cung cấp. Tuy nhiên, tự động thêm hoặc xóa một khóa (định nghĩa ràng buộc) thì phức tạp hơn một chút.

Bất kỳ suy nghĩ nào về việc này có nên được thực hiện hay không.

Tôi nghĩ cách tốt nhất là tạo lại bộ phun mỗi lần thêm/xóa ràng buộc xảy ra sao chép các định nghĩa từ bản gốc sang định dạng mới, Mọi tập tin hiện có sẽ được định nghĩa lại bởi toInstance thay vì thực hiện loại ...

Trả lời

7

Kim tiêm trẻ em có thể được sử dụng để thực hiện điều này, nhưng nó đòi hỏi một số thiết lập. Kim tiêm trẻ em sẽ ngăn ngừa các ràng buộc lâu dài tùy thuộc vào những ràng buộc sống ngắn. Dưới đây là ví dụ:

class ForeverModule extends AbstractModule { 
    ... 
} 

class TemporaryModule extends AbstractModule { 
    ... 
} 

class Main { 
    public static void main(String... args) { 
     Injector foreverInjector = Guice.createInjector(new ForeverModule()); 

     Injector injector = foreverInjector.createChildInjector(
       new TemporaryModule()); 
     /* 
     * Do stuff with the injector as you would normally. When you 
     * get bored of that injector, create a replacement injector 
     * as a child of the long-lived injector. 
     */ 
    } 
} 

Kết nối Singleton trong mô-đun mãi mãi sẽ tồn tại miễn là mô-đun đó tồn tại. Kết nối Singleton trong mô-đun tạm thời sẽ kéo dài miễn là bạn đang sử dụng bộ phun tương ứng.

Cảnh báo: Theo mặc định, các liên kết chỉ trong thời gian sẽ được tạo trong bộ phun cấp cao nhất. Nếu bạn cần một ràng buộc để được sống ngắn, bạn cần phải ràng buộc cả hai giao diện và thực hiện trong mô-đun của con injector của bạn. Có vẻ như thế này:

public void configure() { 
     bind(Foo.class).to(RealFoo.class); 
     bind(RealFoo.class); 
    } 
+0

Tôi đoán rằng sẽ thực hiện công việc mặc dù cần lập kế hoạch những gì đi vào mô-đun nào, để mọi thứ nằm trong các mô-đun riêng biệt với quyền được thay thế theo ý muốn. –

+0

Ý kiến ​​của bạn về việc xây dựng lại một Injector từ đầu bằng cách sao chép tất cả các ràng buộc từ bản gốc (bỏ qua các ràng buộc được xây dựng cho c.g.i.Injector.class). Có bất kỳ bất lợi w/cách tiếp cận này trên thác và sáp nhập tiêm createChildInjector? –

+0

Sao chép các ràng buộc từ mô-đun này sang mô đun khác không thực sự hiệu quả. Ở mức tối thiểu, tất cả các phạm vi sẽ được đặt lại, vi phạm yêu cầu singleton của bạn. –

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