私はDIにかなり慣れていないので、いくつか質問があります.
このアプリケーションは、出荷を追跡するために使用され、いくつかの部分で構成されています。分かりやすく説明できればと思いますが、わかりにくかったらご指摘ください。
データベースから (Web サービス経由で) いくつかのエンティティが返されました。例はshipments
、、、containers
ですpackages
。
これらのエンティティごとに、webservice エンティティをラップするモデルとmanagerがあります。 manager は webservices を介した標準の CRUD 操作を担当しObservableCollection
、modelviewmodels
の を格納します。これらの manager は、そのコンストラクターに注入されます。これらのリストへのアクセスが必要です。
だから、私は出荷>出荷マネージャー>出荷リストビューモデルを持っています、これは出荷viewmodels
の同じリストで複数の作業を可能にするために行われました
ただし、 6 つ以上のマネージャーviewmodels
を含むコンストラクターが含まれているものや、新しく構築された .dialog viewmodels
誰かがこの問題に対する明確な解決策を提案してくれることを願っています。すべてのmanagerのコンテナになる単一のクラスを考えています。その後、そのコンテナクラスを単純に注入し、それを使用して目的のManagerを取得できます。ただし、理由を明確に述べずに、その方法に反対する人がいるのを見てきました。
また、もう 1 つの質問です。私のモデルは実装されIEditableObject
ており、マネージャーはモデルのリストを維持し、それらのモデルへの変更を保存する責任がEndEdit
あるため、マネージャーがピックアップした内部でイベントを公開することは問題になりますか?
編集: 要求されたコード:
ブートストラップは、必要なクラスを作成してエクスポートします。
protected override void Configure()
{
container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
CompositionBatch batch = new CompositionBatch();
IEventAggregator eventAggregator = new EventAggregator();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(eventAggregator);
batch.AddExportedValue<IManager<ShipmentContainer>>(new ContainerManager());
batch.AddExportedValue<IManager<Item>>(new ItemManager());
batch.AddExportedValue<IManager<OrderedItem>>(new OrderedItemManager());
batch.AddExportedValue<IManager<Package>>(new PackageManager());
batch.AddExportedValue<IManager<Proforma>>(new ProformaManager(eventAggregator));
batch.AddExportedValue<IManager<Project>>(new ProjectManager());
batch.AddExportedValue<IManager<Shipment>>(new ShipmentManager(eventAggregator));
batch.AddExportedValue<IManager<PackingItem>>(new PackingListManager(eventAggregator));
batch.AddExportedValue(container);
container.Compose(batch);
}
ContentViewModel はメニュー クリックを処理し、複数のダイアログを開くことができます。コンストラクターには多数の DI が含まれています。
public LBLContentViewModel(IWindowManager windowManager, IManager<Project> pManager, IEventAggregator eventManager, IManager<Item> iManager, IManager<PackingItem> plManager, IManager<Shipment> sManager)
{
...
}
ダイアログは次のように表示されます。
public void OpenProject()
{
ProjectSearchViewModel viewModel = new ProjectSearchViewModel(_eventAggregator, _projectManager);
this._windowManager.ShowDialog(viewModel);
}
うまくいけば、これはあなたがcharlehを見たいと思っていたコードです。そうでない場合は、私に知らせてください。必要なものを提供します.