Caliburn.Micro を使用し、さまざまな種類のシェルにフレームを提供する WPF アプリケーションがあります。これらのシェルはすべてインターフェースを実装していますIShell
。
例として、ホストとして機能するメイン ウィンドウと、ロードされたさまざまなシェルをホストするタブ コントロール (シェルごとに 1 つのタブ) を取り上げます。各シェルは、タブを閉じることで閉じることができます。
現在、IOC サポート、構成 (属性付き)、および子コンテナーに MEF を使用しています。
ユーザーの操作でシェルが開かれます。プラグイン情報やその他のデータが保存されているファイルを選択します。
このファイル データといくつかの固定タイプ (レポートなど) に基づいて、シェルが作成され、フレームでホストされます。
プラグイン アセンブリに配置されているすべてのコンポーネントとその他のフレームワーク コンポーネントのスコープはシェルに限定する必要があり、その他のコンポーネントはフレームのコンポーネントになります。
ユーザーがタップを閉じると、動的に作成されたスコープを破棄できます。
フレームは現在、プラグイン シェル コンポーネントの作成を担当しており、これらのビュー/ビューモデルをフレーム インフラストラクチャに追加する必要があるためです。
フレーム用のカリバーンブートストラップはこんな感じ
protected override void Configure()
{
// register host assembly
AssemblyScanner.AddAssembly(typeof(AppBootstrapper).Assembly);
m_container = new Container();
container.RegisterSingle<IWindowManager, WindowManager>();
container.RegisterSingle<IEventAggregator, EventAggregator>();
container.RegisterSingle<IShellFactory, ShellFactory>();
// view and viewmodel registrations for the shell
// scan binaries folder for all implementations of IShell
var shells = AssemblyScanner.ScanForType<IShell>();
// register them as a collection and lifetimescoped
foreach (var shell in shells)
{
m_container.Register(shell, shell, new LifetimeScopeLifestyle());
}
m_container.RegisterAll<IShell>(shells);
m_container.Verify();
}
シェルを作成する工場
public IEnumerable<IShell> GetAll()
{
using (m_container.BeginLifetimeScope())
{
var instances = m_container.GetAllInstances<IShell>();
return instances;
}
}
フレームのメインビューモデルでは、ファクトリが呼び出されます
protected override void OnInitialize()
{
var shells = m_factory.GetAll();
Items.AddRange(shells);
}
プラグインは、必要な登録を指定しますが、これもライフタイム スコープになります。
var shells = m_factory.GetAll();
範囲指定されたサービスが意味のある範囲外で要求されていることを除いて、呼び出しは失敗します。
ドキュメントとサンプルを読んだ後、SimpleInjector でそれを構築する方法がわかりません。
子コンテナーの作成と管理は、SimpleInjector では間違っているようです。今、私は何かが恋しいと感じています。
アップデート
はい、ユーザーはタブを切り替えることができ、タブを閉じることができ、VisualStudio によく似ているため、モーダル ウィンドウは使用できません。
ユーザーは、ロードされた画面でファイルを選択します。次に、すべてのプラグイン情報が収集され、プラットフォーム プラグインとマージされます。これで、タブのコンテンツが構築される一連のタイプ (ビューモデル、サービスなど) ができました。