检查可选模块可用性

Check optional module availability

我正在用 C# 为 Unity 编写一个项目,它是一种由多个模块、一个核心模块和几个可选模块组成的框架。

在核心模块中,一些代码需要检查是否存在可选模块之一,以便能够添加与可选模块相关的组件。这一切都发生在编辑器模式下。

我首先想到我可以通过在可选模块的 class 中设置 #define 然后简单地 check/exclude 核心模块中的代码部分来使用编译器指令来实现这一点。但是该选项不是最佳选择,因为它仅在 Visual Studio 构建属性中设置这些定义时才有效(我不能要求购买我的框架的用户这样做)。

还有哪些方法可以实现核心模块检查可选模块是否可用的要求?

如果我没理解错的话,听起来设计的耦合方向是错误的,因为核心模块对可选模块的了解太多。核心模块不应检查已知的可选程序集列表。这样做会引入从主程序集到子程序集的不需要的耦合。核心模块独立于"optional modules"不是更好吗?

What other methods are there to achieve the requirement of the core module checking whether an optional module is available?

插件系统

也许考虑一个插件系统,其中 "core module" 仅负责加载可能存在的任何模块。也许模块只是子 Plugins(或 Modules)文件夹中的 .DLL。每个模块可能有一个主模块 class,它继承自已知的基础 class 或实现特定的 IPlugin 接口。加载时,它是将适当组件而非核心模块添加到编辑器的插件。

好处

  • 每个插件都是专家,它单独添加编辑器所需的组件
  • 核心模块与modules/plugins
  • 解耦
  • 核心模块不知道插件中公开的功能。
  • 不需要#define

我并不是说您需要引入 Microsoft MAFMEF,只是一种基于动态加载可选代码的最小工作机制是否存在插件 dll。