سؤال

لنفترض أن لدي واجهة تسمى SocialNetworkService, وثلاثة تطبيقات - TwitterService, FacebookService و FriendFeedService.

الآن أريد ، كلما تلقيت حبوب الويب المدارة (أو أي مكون ويب) رسالة ، لمشاركتها في جميع الشبكات الاجتماعية. حاولت:

@Inject private List<SocialNetworkService> socialNetworkServices;

لكنه لم ينجح (خطأ النشر). (حاول أيضا ل @Any التصفيات - نفس النتيجة)

لذلك ، هل هناك طريقة لحقن قائمة بجميع تطبيقات الواجهة (أو بعضها)؟

أعلم أن القاعدة القائلة بأن نقطة حقن معينة لا ينبغي أن تحتوي على أكثر من حبة واحدة ممكنة. أعتقد أنه يمكنني تحقيق ذلك من خلال إنشاء منتج ينتج القائمة ، واستخدام Instance<SocialNetworkService>, ، لكن هذا يبدو أكثر من اللازم لهذه المهمة.

هل كانت مفيدة؟

المحلول

الجمع بين محاولاتي مع إجابة من منتدى اللحام:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance الأدوات Iterable, ، لذلك من الممكن بعد ذلك ببساطة استخدام حلقة EACH. ال @Any هناك حاجة إلى التصفيات.


هناك طريقة أخرى للقيام بذلك وهي باستخدام نظام الأحداث:

  • إنشاء MessageEvent (تحتوي على جميع المعلومات حول الرسالة)
  • بدلاً من حقن قائمة الشبكات الاجتماعية ، ببساطة حقن الحدث:

    @Inject private Event<MessageEvent> msgEvent;
    

    وإطلاقه: msgEvent.fire(new MessageEvent(message));

  • لاحظ الحدث في جميع الخدمات (بغض النظر عن واجهتهم ، والتي قد تكون زائد):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    

نصائح أخرى

لقد ألقيت نظرة على مواصفات JSR-299 ولا يبدو أنه يمكنك فعل ما تريد القيام به بسهولة وليس لدي خبرة كافية مع اللحام لتوفير التعليمات البرمجية لهذه الحالة الخاصة.

ومع ذلك ، استنادًا إلى الفصل 12.3 "Discovery" ، قد تكون قادرًا على إعلان التطبيقات باعتبارها @Alternative's (لتجنب الشكوى لحام حول التطبيقات المتعددة) والاستماع إلى أحداث ProcessBean لجمعها عند رؤية تطبيقات SocialNetWorkservice.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top