0

我有一个使用 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 是一个通用主机窗口,具有基本的窗口布局(菜单、工具栏、状态栏、主要内容区域)。这些应用程序都具有相同的外观和行为相似,因为它们共享外壳。

我的应用程序从加载的模块中获得各自的功能,因此我为每个应用程序提供了一个引导程序项目,它将所有内容(基础设施、外壳、模块)组合在一起。

我想如果我需要开发一个与当前应用程序非常不同的全新应用程序,我将能够重用基础设施项目,但不能重用外壳。这就是为什么我对将基础设施项目和外壳解耦感到好奇的原因。

4

1 回答 1

2

我认为你的逻辑倒退了。你的外壳是将所有东西粘合在一起的粘合剂。在我看来,您希望基础设施和外壳紧密耦合,因为它们是应用程序。您的模块是将动态更改和切换的应用程序的一部分。你希望你的 shell 区域是静态的,例如,另一个开发人员可以为你的应用程序编写一个模块,知道他的不同视图将被放置在哪里,以及应用程序在附加他的模块时应该如何表现。基础设施项目是在你的 shell 和它的模块之间的过渡......至少在我的书中,这只是生活中的一个事实。WPF 专家之一可能会想出一些明天绝对将其从水中吹出来的东西....

于 2010-04-29T17:47:07.710 回答