1

我的任务是编写一个技术规范(然后实施)一个将建立在几个子模块上的系统。子模块将部分并行开发,所以我真的很想避免每次添加或更新插件时重新启动整个系统。由于我已经在另一个项目中使用过 Simple Injector,因此我计划在每个子模块中将其用于 IoC。我的计划不是在将模块绑定在一起的核心中引入 MEF(托管扩展框架)或 MAF(托管插件框架),而是看看 Simple Injector 是否也可以用于处理模块。

我的计划是使用 FileSystemWatcher 来监视插件目录,当检测到更改时,要么让 Simple Injector 做这件事,要么可能推出我自己的解决方案。我已经阅读了这里的讨论,但我相信我的用例是不同的。

要求:

  • 核心系统作为 Windows 服务运行,应避免一直重启
  • 每个模块负责在内部编排需要完成的工作(可能很多,因此不需要重新启动所有内容)
  • 整个系统是基于事件的。模块将向事件总线发出事件,以便其他模块可以根据事件做出反应(做这件事)。然而,模块也将被允许定期做一些事情。Fx 一个模块监听目录中的新文件,解析文件并将数据放入数据库。其他模块可能需要根据这些新数据做一些事情。另一个模块进行一些定期计算。
  • 所有模块都将共享一个通用接口 IModule,该接口将使核心系统能够启动和停止(处置)模块,如果我找不到其他方法,也许还有注册事件总线的方法
  • 在系统重新启动(fx 服务器重新启动)时,核心当然应该能够获取所有现有模块

为了能够动态加载/重新加载程序集,我计划在单独的 AppDomain 中运行每个模块。

这可以使用简单注射器吗?还有其他想法吗?也许是我没有想到的。

4

2 回答 2

1

这不是 DI Containers 所促成的。他们只是组成对象图。在我看来,您需要运行隔离的进程或应用程序域(否则将无法重新加载它们)。

这意味着 DI 容器将在该模块内的隔离域(即您的模块)广告中运行,您将像始终使用它一样使用您的容器。这与 Simple Injector 没有什么不同。

于 2018-06-08T11:16:07.330 回答
0

因此,根据与 Steven 的通信,我决定寻找替代方案并与我的 CTO 交谈。这导致了完全不同的架构(微服务 - 可能实现为 Azure Functions)通过消息总线(Azure 服务总线)进行通信。这符合所有要求,并且(使用 Azure Functions)确保我们仅在发生应处理的事件时才为计算能力付费。

于 2018-08-24T07:19:47.017 回答