如何使用 Micronaut 注册和运行单个接口的所有实现?

问题描述

假设我有一个简单的界面:

public interface Event {
    void execute(SomeClient client);
}

我有 5 个类实现了这个接口,例如:

public class FirstEvent implements Event {
    @Override
    public void execute(SomeClient client) {
        //do varIoUs things here
        client.registerEvent(someData)
    }

我想要实现的是在应用程序启动期间运行 execute(SomeClient client) 接口的所有 5 个实现的 Event 方法

我已经有了启动我需要的所有事件的代码,但我想将这些事件分成多个类,并有一个单点执行这些事件。我想创建一个 Event 接口,并制作多个带有 Micronauts @Singleton 注释的实现,这样我就可以简单地将它们全部注册,而不必将它们一一添加到当前正在执行它们的类中一个

这个接口解决方案是一个好的决定吗?有没有更好的方法来做到这一点?实现我想要的最佳方法是什么(使用单个方法运行所有类而不是一个一个地运行它们)?

解决方法

这个界面解决方案是一个好的决定吗?

是的。

有没有更好的方法来做到这一点?

一般来说,没有。

实现我想要的最佳方式是什么(运行所有课程 用一个方法而不是一个一个地运行它们)?

没有客观上“最佳”的方法,因为您可以使用不同的技术针对不同的目标进行优化。一种选择是您可以将所有 Event bean 注入到将对所有这些 bean 调用 execute 方法的东西中。

@Singleton
public class SomeBean {
    private List<Event> events;

    public SomeBean(List<Event> events) {
        this.events = events;
    }

    // In this class you have all of the `Event`.
    // it is not clear from the question where the
    // SomeClient instance comes from,but once
    // you have that you could iterate over all
    // of the events and pass the client to the
    // execute method on each Event.
}