2013-08-30 70 views
0

标题听起来有点不清楚,我不确定术语。但我的问题是:我现在正在实施我们的软件的许可证验证功能,该软件由多个模块组成。例如,函数调用类似于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中列出,但从长远来看,让所有模块可能出现在列表中会更好。

+0

您是否曾经需要在没有启用ModuleB的情况下启用ModuleA?反之亦然? – Surveon

+0

难道你不能创建一个遍历模块及其相关模块的循环,建立一个唯一模块名称的映射。如果模块已经存在于地图中,请跳过它。当你到达这个循环的末尾时,循环遍历新创建的地图,然后对它们执行布尔检查。 –

+0

而不是返回true或false可能返回的依赖模块的名称,你可以检查模块名称是否是调用的名称。您必须返回除真或假之外的其他内容才能停止连续循环。 – Sorceri

回答

0

已经列出所有已经验证许可证的模块,并在调用潜在的冗余验证之前签入此组。如果该组中没有值,则在那里验证并添加已验证模块的名称。

有另一个类似的设置列表模块验证明知故障,所以我们也不会进入这种情况下的无限循环。

如果验证并行发生,知识在集合中累积直到足以打破循环,这也应该起作用。

+0

谢谢,这很有道理! – tete