1

私はDIにかなり慣れていないので、いくつか質問があります.

このアプリケーションは、出荷を追跡するために使用され、いくつかの部分で構成されています。分かりやすく説明できればと思いますが、わかりにくかったらご指摘ください。

データベースから (Web サービス経由で) いくつかのエンティティが返されました。例はshipments、、、containersですpackages

これらのエンティティごとに、webservice エンティティをラップするモデルとmanagerがあります。 manager は webservices を介した標準の CRUD 操作を担当しObservableCollectionmodelviewmodelsの を格納します。これらの 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を見たいと思っていたコードです。そうでない場合は、私に知らせてください。必要なものを提供します.

4

4 に答える 4

2

最良の答えはすでにあなたの質問にあると思います:

誰かがこの問題に対する明確な解決策を提案してくれることを願っています。すべてのマネージャーのコンテナーになる単一のクラスを考えています。その後、そのコンテナー クラスを単純に注入し、それを使用して目的のマネージャーを取得できます。ただし、理由を明確に述べずに、その方法に反対する人がいるのを見てきました。

これが私の意見では最良の答えです。同じもののセットをコンストラクターの 1 つに常に注入していることがわかった場合、そのオブジェクトのセットは、クラスに結合された場合に意味のある何らかの論理グループを形成する可能性が最も高くなります。

また、クラスとその依存関係の分析に関する @margabit の回答も参考にしてください。設計とは異なる構造が最初にこれを回避できた可能性がありますが、戻ってすべてを変更できるとは限りません。

于 2013-09-03T17:02:01.097 に答える
-2

DI (依存性注入) コンポーネントを使用することをお勧めします。とてもクリーンでパワフルです。

いくつかの一般的な DI コンポーネント: - Ninject - Unity - Castle.Windsor - Autofac - StructureMap

それ以外の場合は、2 つ以上のクラスを持つインターフェイスの型を型とするプロパティを定義できます。次に、適切なオブジェクトを動的に作成し、それをプロパティに設定します。適切なオブジェクトを動的に作成するときに使用される構成ファイルに、クラス名と完全修飾クラス名のマッピングを保存できます。

于 2013-09-03T16:19:59.503 に答える