我有一个使用Microsoft Composite Application Library设计的应用程序。我的shell定义了几个regions,以便我可以从单独的模块中注入内容。我正在寻找一种能够减少这些区域引入的耦合的设计模式。
在我看到的所有示例中,使用基础结构项目中静态类中的字符串定义和访问区域。:
<ItemsControl cal:RegionManager.RegionName="{x:Static inf:RegionNames.TabRegion}">
public static class RegionNames
{
public const string TabRegion = "TabRegion";
}
这引入了对基础结构项目的shell的依赖性,因为基础结构项目的一部分现在必须与shell匹配。如果您尝试访问未定义的区域,CAL RegionManager会抛出异常,因此我必须确保基础结构和shell项目保持同步。
有没有办法隔离shell的区域,以便它们只在shell中定义(基础结构项目中没有区域名称)?
有没有办法让区域可选,这样即使它们没有所有相同的区域,也可以换掉shell? (一个例子:一个shell有菜单和工具栏区域,另一个只有菜单...模块应该能够注入到工具栏中,如果可用的话,不会失败的话)
为了回应下面的depictureboy's answer,我想描述一下我的系统设置方式......也许会有更好的反馈意见。
我将Infrastructure和Shell项目视为通用库,我有几个使用它们的应用程序。 Infrastructure项目提供“框架”代码和资源(如MVVM东西,反射,图标),我的Shell是一个通用主机窗口,具有基本窗口布局(菜单,工具栏,状态栏,主要内容区域)。这些应用程序都具有共同的外观并且行为相似,因为它们共享shell。
我的应用程序从加载的模块中获取它们各自的功能,因此每个应用程序都有一个引导程序项目,它将所有内容(infra,shell,模块)拉到一起。
我想如果我需要开发一个与现有应用程序截然不同的全新应用程序,我将能够重用基础结构项目,而不是shell。这就是为什么我对解耦基础设施项目和shell感到好奇。
答案 0 :(得分:2)
我认为你的逻辑倒退了。你的外壳是粘合在一起的所有东西。在我看来,您希望基础架构和shell紧密耦合,因为它们应用程序。您的模块是应用程序中将动态更改和切换的部分。您希望您的shell区域是静态的,例如,另一个开发人员可以为您的应用程序编写一个模块,知道他的不同视图将被放置在何处以及应用程序应该如何在其模块附加的情况下运行。基础设施项目是在你的shell和它的模块之间进行的...这至少在我的书中是生活中的事实。其中一位WPF大师可能会想出一些明天会把它从水里吹出来的东西......