使用 Simple Injector 构建基于插件的应用程序
Building a plugin-based application with Simple Injector
我的任务是编写技术规范(并在稍后实施)一个将构建在几个子模块上的系统。子模块将部分并行开发,所以我真的很想避免每次添加或更新插件时重新启动整个系统。因为我已经在另一个项目中使用过 Simple Injector,所以我计划在每个子模块中将它用于 IoC。与其在将模块绑定在一起的核心中引入 MEF(托管扩展框架)或 MAF(托管插件框架),我的计划是看看 Simple Injector 是否也可以用于处理模块。
我的计划是使用 FileSystemWatcher 监视插件目录,当检测到更改时,要么让 Simple Injector 执行它,要么推出我自己的解决方案。我已阅读讨论 here,但我相信我的用例有所不同。
要求:
- 核心系统作为 Windows 服务运行,应避免一直重启
- 每个模块负责在内部编排需要完成的工作(这可能很多,因此需要不重启一切)
- 整个系统都是基于事件的。模块将向事件总线发出事件,以便其他模块可以根据事件做出反应(做它的事情)。然而,模块也将被允许定期做一些事情。 F.x。一个模块侦听目录中的新文件,解析文件并将数据放入数据库中。其他模块可能需要根据这个新数据做一些事情。另一个模块做一些周期性的计算。
- 所有模块都将共享一个通用接口 IModule,该接口将使核心系统能够启动和停止(处置)模块,如果我找不到其他解决方法,可能还有注册事件总线的方法
- 系统重启(f.x。服务器重启)核心当然应该能够获取所有现有模块
为了能够动态 load/reload 程序集,我计划 运行 每个模块在单独的 AppDomain 中。
使用 Simple Injector 可以吗?还有其他想法吗?也许是我没有想到的。
这不是 DI 容器所促进的。他们只是组成对象图。在我看来,您需要 运行 隔离进程或应用程序域(否则无法重新加载它们)。
这意味着 DI 容器将 运行 在该隔离域(即您的模块)和该模块内,您将像往常一样使用您的容器。这与 Simple Injector 没有什么不同。
因此,根据与 Steven 的通信,我决定寻找替代方案并与我的 CTO 交谈。这导致了一个完全不同的架构(微服务——可能作为 Azure Functions 实现)通过消息总线(Azure 服务总线)进行通信。这符合所有要求,并且(使用 Azure Functions)确保我们仅在出现应处理的事件时才为计算能力付费。
我的任务是编写技术规范(并在稍后实施)一个将构建在几个子模块上的系统。子模块将部分并行开发,所以我真的很想避免每次添加或更新插件时重新启动整个系统。因为我已经在另一个项目中使用过 Simple Injector,所以我计划在每个子模块中将它用于 IoC。与其在将模块绑定在一起的核心中引入 MEF(托管扩展框架)或 MAF(托管插件框架),我的计划是看看 Simple Injector 是否也可以用于处理模块。
我的计划是使用 FileSystemWatcher 监视插件目录,当检测到更改时,要么让 Simple Injector 执行它,要么推出我自己的解决方案。我已阅读讨论 here,但我相信我的用例有所不同。
要求:
- 核心系统作为 Windows 服务运行,应避免一直重启
- 每个模块负责在内部编排需要完成的工作(这可能很多,因此需要不重启一切)
- 整个系统都是基于事件的。模块将向事件总线发出事件,以便其他模块可以根据事件做出反应(做它的事情)。然而,模块也将被允许定期做一些事情。 F.x。一个模块侦听目录中的新文件,解析文件并将数据放入数据库中。其他模块可能需要根据这个新数据做一些事情。另一个模块做一些周期性的计算。
- 所有模块都将共享一个通用接口 IModule,该接口将使核心系统能够启动和停止(处置)模块,如果我找不到其他解决方法,可能还有注册事件总线的方法
- 系统重启(f.x。服务器重启)核心当然应该能够获取所有现有模块
为了能够动态 load/reload 程序集,我计划 运行 每个模块在单独的 AppDomain 中。
使用 Simple Injector 可以吗?还有其他想法吗?也许是我没有想到的。
这不是 DI 容器所促进的。他们只是组成对象图。在我看来,您需要 运行 隔离进程或应用程序域(否则无法重新加载它们)。
这意味着 DI 容器将 运行 在该隔离域(即您的模块)和该模块内,您将像往常一样使用您的容器。这与 Simple Injector 没有什么不同。
因此,根据与 Steven 的通信,我决定寻找替代方案并与我的 CTO 交谈。这导致了一个完全不同的架构(微服务——可能作为 Azure Functions 实现)通过消息总线(Azure 服务总线)进行通信。这符合所有要求,并且(使用 Azure Functions)确保我们仅在出现应处理的事件时才为计算能力付费。