我有一个使用 Microsoft 的Composite Application Library设计的应用程序。我的 shell 定义了几个区域,以便我可以从单独的模块中注入内容。我正在寻找一种可以减少这些区域引入的耦合的设计模式。
在我看到的所有示例中,区域都是使用基础设施项目中的静态类中的字符串定义和访问的。:
<ItemsControl cal:RegionManager.RegionName="{x:Static inf:RegionNames.TabRegion}">
public static class RegionNames
{
public const string TabRegion = "TabRegion";
}
这引入了基础设施项目对 shell 的依赖,因为基础设施项目的一部分现在必须与 shell 匹配。如果您尝试访问未定义的区域,CAL RegionManager 会引发异常,因此我必须确保基础设施和外壳项目保持同步。
有没有办法隔离外壳的区域,以便它们仅在外壳内定义(基础设施项目中没有区域名称)?
有没有办法使区域成为可选的,以便即使它们没有所有相同的区域也可以换出外壳?(一个例子:一个shell有菜单和工具栏区域,另一个只有菜单......如果工具栏可用,模块应该能够注入工具栏,如果不可用则不会失败)
更新 - 有关我的架构的更多详细信息
为了回应下面depictureboy的回答,我想描述一下我的系统设置方式......也许会有更多好的反馈。
我将 Infrastructure 和 Shell 项目视为通用库,并且我有几个使用它们的应用程序。Infrastructure 项目提供“框架”代码和资源(如 MVVM 的东西、反射、图标),而我的 Shell 是一个通用主机窗口,具有基本的窗口布局(菜单、工具栏、状态栏、主要内容区域)。这些应用程序都具有相同的外观和行为相似,因为它们共享外壳。
我的应用程序从加载的模块中获得各自的功能,因此我为每个应用程序提供了一个引导程序项目,它将所有内容(基础设施、外壳、模块)组合在一起。
我想如果我需要开发一个与当前应用程序非常不同的全新应用程序,我将能够重用基础设施项目,但不能重用外壳。这就是为什么我对将基础设施项目和外壳解耦感到好奇的原因。