3

WPFアプリケーション内の定義された領域にビューを動的に挿入するアセンブリに取り組んでおり、次のことを達成しようとしています:

アプリケーションでは、ビューとそのビューモデルの基礎となるモデル オブジェクトにアプリケーション データをロードできるようにしたいと考えています。

次に、モデル データをアプリケーション独自のデータ ストレージ メカニズム内に保存したいと考えています。

私が最も関心を持っているのは、MVVM パターンに適合する疎結合設計を維持することです。アプリケーションで領域を定義しました。アセンブリは、適切なビューがその領域に動的に挿入されるように記述されています。問題は、私が理解しているように、ビューがアプリケーションの観点からは何でもあり得るということです。さらに、アプリケーションがビューのモデルまたはビュー モデルを参照することは適切ではないようです。

そのようなシナリオのためにMVVMに何かありますか? アプリケーションが何らかの方法でモデルと対話できるようにするには、どのような設計が適切でしょうか?

ビューは多くの 1 つでもあります。理想的には、ビューの複数のインスタンスがあり、それぞれがモデルのインスタンスのビューを提供することを望みます。アプリケーションは、理想的には、いつでも選択したモデルにデータをロードしたり、選択したモデルからデータをロードしたりできる必要があります。

この投稿に十分に含まれていない場合はお詫び申し上げます。プロジェクトの詳細を避けるために、一般的な内容を残そうとしています。質問があれば、喜んで明確にするか、より多くの情報を提供します。

4

1 に答える 1

1

コンポーネントが 2 つの間の通信なしでシェルに収まるようにするには、特定のモジュールのすべてのロジック (保存/読み込みなど) をそのモジュールに配置する必要があります。

ただし、実装を結合せずにシェルがプラグインと通信することは十分に可能ですが、2 つの間でいくつかの共通のメカニズムを持つことを検討することをお勧めします。

ほとんどの場合、プラグインをより適切に統合するために、プログラミングできる共通 API を備えたシェル プロジェクト用の拡張フレームワーク ライブラリが必要になるでしょう。

MEF を使用すると、プラグインの検出や読み込みなどを非常に簡単に行うことができます。インターフェイスは、プラグイン スタイルのフレームワークを設計するときの友です。プラグインに特定のインターフェースを実装させるということは、プラグインが実際に何をするのかにとらわれずに、シェルがプラグインと通信できることを意味します。

簡単な例は、ツールバーのコマンド コレクションです (各プラグインは、使用可能なコマンドに基づいて動的にボタンを作成するツールバーにコマンドを登録できます)。

拡張ライブラリ (シェルとプラグインの両方がこのライブラリを参照します):

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

また、プラグイン アセンブリ内のどの 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);
        }
    }
}

コマンドはプラグインに翻弄されます。シェルが VM 自体について何も知らなくても、プラグインはどのコマンドをシェルで使用できるかを指示できます。

これが役立つかどうか教えてください

于 2013-09-05T16:00:07.957 に答える