1

昨年、ページ ナビゲーションを使用し、MVVM を使用しない WPF アプリケーションを作成しました。最近、Caliburn Micro と MEF を使用して WPF MVVM で行ったのと同じ顧客向けに新しいアプリケーションを構築するように依頼されました。現在、顧客から、新しいアプリケーションを古いアプリケーションに統合するように依頼されています。

私の考えは、古いアプリケーションに新しいページを追加し、新しいアプリケーションのシェルをこのページの に統合することでしたContentControl

私の問題は、古いアプリケーションが

<StartupUri="Views\NavWindow.xaml">

app.xaml のエントリで、新しいアプリケーションは次のようなブートストラップによって開始されます。

<local:AppBootstrapper x:Key="bootstrapper" />

AppBootstrapper は次のようになります

class AppBootstrapper : Bootstrapper<ShellViewModel>
{
    private CompositionContainer container;

    protected override void Configure()
    {
        container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));

        CompositionBatch batch = new CompositionBatch();

        batch.AddExportedValue<IWindowManager>(new WindowManager());
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());
        batch.AddExportedValue(container);

        container.Compose(batch);
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
        var exports = container.GetExportedValues<object>(contract);

        if (exports.Count() > 0)
        {
            return exports.First();
        }

        throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
    }

} 

したがって、私が理解している限り、新しいアプリの場合、ブートストラッパーはアプリ全体を初期化し、 を呼び出し、ShellViewModel最終的にShellView.

EventAggregatorは新しいアプリで を使用して、あるビューモデルから別のビューモデルにメッセージを送信するため、ブートストラップを取り除き、Caliburn Micro のビュー ファースト モデルを使用することはできないと思います。

したがって、私の問題は次のとおりです。古いアプリから自分でブートストラップを呼び出すことができますか?もしそうなら、そのインスタンスをどこに保存する必要がありますShellViewか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

CM は非常に軽いため、このような状況では、特定のクラスが実際に何を行っているかを確認するためにソースを覗いてみる価値があります。

アプリケーションのBootstrapperリソースファイルで宣言すると、インスタンス化が強制されるため、機能します。コンストラクターはStartインスタンスを呼び出し、アグリゲーター、IOC などを設定します。

https://caliburnmicro.codeplex.com/SourceControl/changeset/view/4de6f2a26b21#src/Caliburn.Micro.Silverlight/Bootstrapper.cs

アプリケーションを別のアプリケーションにロードする場合ContentControl、ロードされたアプリケーションのリソースがまだ処理され、インスタンス化され、起動されるため、CM を開始しない理由がわかりませんBootstrapper。テストプロジェクトで?それが最初の選択肢かもしれません。

CM のデフォルトの実装が理想的ではない領域がいくつかあるBootstrapperかもしれませんが、一見したところ、明らかな問題は見当たりません (OnStartupサブアプリケーションをロードするときに etc などのアプリケーション イベントがどうなるかわからないので、それを見るために)。最悪の場合Bootstrapper、サブアプリ用に独自のロールを作成し、微調整した機能で再構築することができます。

于 2013-01-31T09:48:11.200 に答える