هل يدعم GIN أي شيء مثل حقن الأطفال؟
سؤال
لدي تطبيق واحد يحتوي على تطبيقات فرعية.أرغب في فصل حقن GIN بحيث يمكن أن يكون لكل تطبيق فرعي مثيلات منفصلة لنفس الفئات الأساسية المشتركة.أريد أيضًا أن يقوم الحاقن بتوفير فئات من بعض الوحدات الأساسية لجميع التطبيقات الفرعية، بحيث يمكن مشاركة المثيلات المفردة.على سبيل المثال
GIN Modules:
Core - shared
MetadataCache - one per sub-application
UserProvider - one per sub-application
في Guice يمكنني القيام بذلك باستخدام createChildInjector
, ، لكن لا يمكنني رؤية معادل واضح في GIN.
هل يمكنني تحقيق شيء مماثل في GIN؟
المحلول
ومن هنا على SOF http://code.google.com/p/google-gin/wiki/PrivateModulesDesignDoc.نأمل أن يساعدك.
نصائح أخرى
لقد قمت بحل هذه المشكلة بفضل الرابط الذي قدمه @Abderrazakk، ولكن بما أن الرابط ليس مرفقًا جدًا بالتعليمات، اعتقدت أنني سأضيف نموذجًا لحل هنا أيضًا:
تسمح لك وحدات GIN الخاصة بالحصول على مستوى واحد من الحقن الهرمي، حيث تكون الأنواع المسجلة داخل الوحدة النمطية الخاصة مرئية فقط للمثيلات الأخرى التي تم إنشاؤها داخل تلك الوحدة.الأنواع المسجلة داخل أي وحدات غير خاصة لا تزال متاحة للجميع.
مثال
دعونا نحصل على بعض أنواع العينات لحقنها (وحقنها):
public class Thing {
private static int thingCount = 0;
private int index;
public Thing() {
index = thingCount++;
}
public int getIndex() {
return index;
}
}
public class SharedThing extends Thing {
}
public class ThingOwner1 {
private Thing thing;
private SharedThing shared;
@Inject
public ThingOwner1(Thing thing, SharedThing shared) {
this.thing = thing;
this.shared = shared;
}
@Override
public String toString() {
return "" + this.thing.getIndex() + ":" + this.shared.getIndex();
}
}
public class ThingOwner2 extends ThingOwner1 {
@Inject
public ThingOwner2(Thing thing, SharedThing shared) {
super(thing, shared);
}
}
قم بإنشاء وحدتين خاصتين مثل هذه (باستخدام ThingOwner2 للوحدة الثانية):
public class MyPrivateModule1 extends PrivateGinModule {
@Override
protected void configure() {
bind(Thing.class).in(Singleton.class);
bind(ThingOwner1.class).in(Singleton.class);
}
}
ووحدة مشتركة:
public class MySharedModule extends AbstractGinModule {
@Override
protected void configure() {
bind(SharedThing.class).in(Singleton.class);
}
}
الآن قم بتسجيل الوحدتين في الحاقن الخاص بنا:
@GinModules({MyPrivateModule1.class, MyPrivateModule2.class, MySharedModule.class})
public interface MyGinjector extends Ginjector {
ThingOwner1 getOwner1();
ThingOwner2 getOwner2();
}
أخيرًا، يمكننا أن نرى ونرى أن كلا من مثيلات ThingOwner1 وThingOwner2 لها نفس مثيل SharedThing من الوحدة المشتركة، لكن مثيلات Thing مختلفة من تسجيلاتها الخاصة:
System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());