3

我正在开发一个程序集,它将动态地将视图注入到 WPF 应用程序内的定义区域中,并且我正在尝试完成以下操作:

在应用程序中,我希望能够将应用程序数据加载到视图及其视图模型下的模型对象中。

然后我想将模型数据保存在应用程序自己的数据存储机制中。

我最关心的是维护适合 MVVM 模式的松散耦合设计。我在我的应用程序中定义了一个区域,并且已经编写了程序集,以便将适当的视图动态注入到该区域中。据我了解,问题在于,从应用程序的角度来看,视图可能是任何东西。此外,应用程序看到我的模型或视图模型的视图似乎不合适。

在这种情况下,MVVM 中有什么东西吗?什么样的设计适合让应用程序以某种方式与我的模型对话?

视图也可能是众多视图之一:理想情况下,我希望有多个视图实例,每个实例都提供模型实例的视图。理想情况下,应用程序应该能够在任何给定时间将数据加载到选定模型中或从选定模型中加载出来。

如果我没有在这篇文章中包含足够的内容,我深表歉意 - 我试图让它足够笼统以避免项目的细节。如果被问到,我很乐意澄清或提供更多信息。

4

1 回答 1

1

为了让您的组件位于外壳中而两者之间没有任何通信,您需要将特定模块的所有逻辑(保存/加载等)放入该模块中。

但是,很可能在不耦合实现的情况下让 shell 与插件通信,尽管您可能需要考虑在两者之间建立一些通用机制。

很可能你会想要一个用于你的 shell 项目的可扩展性框架库,它有一个你可以编程的通用 API,以便更好地集成你的插件

MEF 允许您非常轻松地进行插件发现/加载等。在设计插件风格框架时,接口是你的朋友。让你的插件实现一个特定的接口意味着你的 shell 可以与插件对话,同时不知道插件的实际作用

一个简单的示例可能是工具栏的命令集合(每个插件都可以使用工具栏注册命令,该工具栏将根据可用的命令动态创建按钮):

在您的可扩展性库中(shell 和插件都引用此库):

public interface IProvideCommands
{
    public IList<IToolBarCommand> AvailableCommands { get; }       
}

您可能还需要一个标记界面来让 shell 应用程序知道插件程序集中的哪些 ViewModel 类型是它应该加载到您的动态区域中的那些(您已经在某种程度上做到了,您是如何实现的?)

public interface IPluginShell { }

在您的插件主 VM 中:

public class SomePluginViewModel : IPluginShell, IProvideCommands
{
    public IList<IToolBarCommand> AvailableCommands { get; private set; } // Populate this etc
}

在你的外壳中:

public class ApplicationShell
{
    public ApplicationShell() 
    {
        // Load plugins
        ....
        // Discover commands
        var commandProvider = SomePlugin as IProvideCommands;

        if(commandProvider != null)
        {
            DoStuffWith(commandProvider.Commands);
        }
    }
}

然后,命令受插件的支配——它们可以指示 shell 可以使用哪些命令,而不是 shell 必须知道有关 VM 本身的任何信息。

让我知道这是否有帮助

于 2013-09-05T16:00:07.957 回答