【问题标题】:Inject list of service objects in CDI (Weld)在 CDI (Weld) 中注入服务对象列表
【发布时间】:2014-01-27 23:02:05
【问题描述】:

假设我有一个名为 SocialNetworkService 的接口,以及多个实现 - TwitterService、FacebookService 和 FriendFeedService、MyService 等。

现在我希望,每当我的托管 bean 收到消息时,根据消息中包含的某些规则选择一个/或多个实现并相应地传输消息。

我不太确定使用哪种模式最好?

a) 使用接口实例,即

@Inject @Any Instance<SocialNetworkService> socialNetworkService;
SocialNetworkService service = socialNetworkService.get();

如何将消息传递给 SocialNetworkServiceFactory?

b) 使用事件观察所有服务中的事件(不管它们的接口如何,这不是我想要的。即如果我不支持不传输...

c)。我可以注解注入,即 @Twitter、@Facebook 都在一个控制器 bean 中,然后选择合适的,但我的服务实现数量会增长....

提前致谢,

迪米特里

【问题讨论】:

    标签: java cdi jboss-weld


    【解决方案1】:

    您总是可以使用迭代器来获取所有当前的实现

    Iterator<SocialNetworkService> it = socialNetworkService.iterator();
    while(it.next()) {
        SocialNetworkService service = it.next();
        //here you can choose by some criterion if the service should receive message or not
        if(service instanceof TwitterNetworkService) {
             //do something
        }
    }
    

    【讨论】:

      【解决方案2】:

      事件/观察者模型可能最适合您。您可以使用一个或多个限定符触发事件,每个限定符都可以绑定到这些服务之一。

      【讨论】:

        【解决方案3】:

        我建议将方法 a) 和 b) 结合起来。

        在您的托管 Bean 中发送所需类型的事件。

        现在您将拥有一个针对该特定事件的事件观察者。此观察者注入您的 SocialNetworkService 的所有可用实现。

        SocialNetworkService 的每个实现现在都应该实现一个接受方法。这意味着当添加新服务时,您无需更改观察者类。

        观察者现在遍历所有可用实例并将检索到的消息(可能是事件本身)交给每个实现的接受方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-04
          • 2011-09-19
          • 1970-01-01
          • 2015-08-06
          • 2015-02-16
          • 1970-01-01
          • 1970-01-01
          • 2021-02-13
          相关资源
          最近更新 更多