+1 امتیاز
قبل در برنامه نویسی توسط (52 امتیاز)
برچسب گذاری دوباره قبل توسط

اگر کلاس های c1 , c2 دو پیاده سازی از یک اینترفیس باشند (مثلا I) هنگام اینجکت کردن توسط  Google Guice چگونه باید مشخص شود که کدام پیاده سازی مورد نیاز است؟

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

شما می تونید از انوتیشن @Named استفاده کنید:

    @Inject
    @Named("yourService")
    private Service service;

اما دقت داشته باشید که استفاده از String بدلیل نداشتن قابلیت static check می تونه مشکل زا بشه و best practice نیست و Guice یک راه جایگزین بهتر نیز دارد که Binding Annotations نام دارد، که در آن شما بجای استفاده از String نوع انوتیشن تعریف می کنید. به مثال زیر توجه کنید:

@BindingAnnotation
@Target( { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Better {}

public class GuiceMain {
      @Inject
      private Car car;

      public static void main(String[] args) {
            Injector injector = Guice.createInjector(new MyModule());
            GuiceMain main = injector.getInstance(GuiceMain.class);
      }

}

public class MyModule extends AbstractModule {
    public void configure() {
        bind(Engine.class).annotatedWith(Better.class).to(BetterEngine.class);
    }
}

public class Car {
    @Inject
    public Car(@Better Engine engine) { ... }

}

public class BetterEngine extends Engine {
    @Inject
    public BetterEngine(Piston piston) {
        super(piston);  
    }

}

البته هم @Named و هم تعریف Binding Annotations هر دو برای مورد شما جواب می دهد.

سوالات مشابه

0 امتیاز
1 پاسخ 419 بازدید
+1 امتیاز
1 پاسخ 808 بازدید
+3 امتیاز
1 پاسخ 4.4هزار بازدید
+1 امتیاز
2 پاسخ 1.1هزار بازدید
0 امتیاز
1 پاسخ 1.6هزار بازدید
0 امتیاز
1 پاسخ 1.3هزار بازدید
0 امتیاز
1 پاسخ 609 بازدید
...