标题听起来有点不清楚,我不确定术语。但我的问题是:我现在正在实施我们的软件的许可证验证功能,该软件由多个模块组成。例如,函数调用类似于License.IsModuleEnabled(m As Module)
(代码在VB.NET中)软件许可证项目:如何避免循环依赖
现在事情是,一个模块通常需要另一个模块作为先决条件,例如,ModuleA才能运行, ModuleB也必须启用。因此,在Module
班级中,我有一个名为RequiredModules
的公开号码,该号码是Module
的列表。所以IsModuleEnabled()
功能会是这个样子:
Public Function(m As Module)
...
For Each module In m.RequiredModules
If Not IsModuleEnabled(module) Then Return False
End For
...
End Function
的问题是明显的(但解决的办法是不给我):如果ModuleA需要ModuleB和ModuleB需要ModuleA,该功能会去一个死循环。
这些模块它们相互平行,所以我不知道如何管理这样的验证功能。我们目前的解决方案是只有一些“基本”模块可以在RequiredModules
中列出,但从长远来看,让所有模块可能出现在列表中会更好。
您是否曾经需要在没有启用ModuleB的情况下启用ModuleA?反之亦然? – Surveon
难道你不能创建一个遍历模块及其相关模块的循环,建立一个唯一模块名称的映射。如果模块已经存在于地图中,请跳过它。当你到达这个循环的末尾时,循环遍历新创建的地图,然后对它们执行布尔检查。 –
而不是返回true或false可能返回的依赖模块的名称,你可以检查模块名称是否是调用的名称。您必须返回除真或假之外的其他内容才能停止连续循环。 – Sorceri