我有一个使用 CQRS 和依赖注入的项目。系统的查询端很好。
对于系统的命令端,我选择使用队列:
BlockingQueue<Command> commandQueue;
这将存储从多个线程接收到的命令及其参数。这些命令都实现了一个带有执行方法的通用接口:
public interface Command extends Serializable {
void execute();
}
Commands 的参数作为数据存储在 Command 接口的具体实现中。参数的类型和可能的数量将根据它所代表的命令而有所不同,使用这种结构意味着这个细节都被封装在命令队列逻辑之外。
这个想法是命令稍后由一个工作线程按顺序执行,该工作线程依次在每个命令上调用 execute(),而不关心它在后台是哪个命令。
这些命令只有在从队列中取出准备执行时才需要注入(这主要是因为我希望能够序列化命令,但也因为命令的执行需要与接收和排队的应用程序部分不同的模块他们)
我的问题是这样 的:因为命令需要等到它们从队列中取出来获取它们的依赖关系,所以我最终将一个轻包装的 Injector 传递给它们的“执行”方法,这样它们就可以自己创建一个对象图。这感觉更像是服务定位器模式,而不是依赖注入。
public interface Command extends Serializable {
void execute(**ExecutorLocator locator**);
}
是否有我遗漏的东西,或者 DI 在堆栈中的某个点必须看起来像服务定位器是不可避免的?