6

ViewModels を Container に登録し、そこから解決する必要がありますか?

利点:

  1. ビューモデルがアクティブになっているときにいくつかのアクションを実行できます
  2. コンテナは私のために依存関係を注入します
  3. ???

欠点:

  1. ViewModel の有効期間の管理には注意が必要です。
    • ViewModel シングルトンを作成すると、同じタイプの複数のコントロールをインスタンス化できません
    • ViewModel を一時的にすると、実際には同じインスタンスが注入されると予想されるときに、いくつかの異なるインスタンスが存在するという状況に簡単に陥る可能性があります。
  2. ???

正解は?生涯不利益を軽減できるのであれば、登録したいと思います。

必要に応じて、Caliburn と Autofac を使用しています。

4

3 に答える 3

5

コンテナは、それが作成するオブジェクトが住むエコシステムです。ビュー モデルはそれらの住民と対話するため、エコシステムの一部でもあります。その関係を正確に反映するには、コンテナーにビュー モデルを登録する必要があります。

常にInstancePerDependencyビュー モデルで使用する必要があります。ビュー モデルは、UI の特定の部分の状態と動作を表します。これは、フレームワーク固有ではないコントロールの類似物です。通常、同じコントロール インスタンスを UI ツリーの 2 つの場所に配置できないのと同様に、同じビュー モデル インスタンスを再利用することもできません。

できれば、それをViewsModel:-)と呼びます

于 2010-10-23T06:51:11.803 に答える
4

2) の利点は、コンテナーがビューモデルを処理できるようにするのに十分です。ビュー インスタンスとビューモデル インスタンスの間に厳密な 1 対 1 の関係がある独自の MVVM フレームワークを使用しています。したがって、1) の欠点は存在しません。

ビュー間でデータを共有する必要がある場合は、ビューモデルに共有サービス インスタンスを挿入することでこれを実現します。

それを除いて、1 つのビューモデル インスタンスが複数のビュー間で共有されることを期待する他の状況はありますか?

于 2010-10-22T14:14:22.237 に答える
0

autofac や Caliburn については不明ですが (まだ適用される可能性があります)、Unity コンテナーに関しては、次の場合にのみ ViewModel を登録します...

コンテナを廃棄する際に廃棄してもらう必要があります。新しく作成された (シングルトンではない) ビュー モデル インスタンスを格納するライフタイム マネージャーを作成できます。

container.RegisterType<MyViewModel>(new DisposeableInstanceLifetimeManager());
...
container.Resolve<MyViewModel>();  // here all dependencies will get injected
...
container.Dispose(); 

データを共有したい場合は、サブ (子) コンテナーを作成してモデルをシングルトンとして登録し、複数のビュー モデルで同じモデルを共有する傾向があります。

var child = container.CreateChildContainer();
child.RegisterInstance(model, new ContainerControlledLifetimeManager());
child.Resolve<MyViewModel1>();
child.Resolve<MyViewModel2>(); // both can share the model instance

Resolve(注: Unityでは、コンテナに登録されていなくても、ViewModel で使用するとすべての依存関係が注入されます)。

それ以外の場合は、シングルトン ViewModel が必要でない限り (それがいつ役立つかはわかりませんが)、ViewModel をコンテナーに追加しても、コードが追加されるだけで何のメリットもありません。

于 2010-10-23T02:05:09.990 に答える