web-dev-qa-db-ja.com

WPF /プリズム:UNITYコンテナーとは何ですか?

私が6歳の子供であるようなUnityコンテナーの概念を誰かに説明してもらえますか?それはどのように機能し、何をしますか?

30
foreyez

これは背景のより技術的な説明です。それでも役に立つと思います。

一般的に言えば、DI(依存性注入)コンテナーです。

次のクラスがあるとします。

public class Sample
{
  Service a;

  public Sample()
  {
    a = new Service();
  }
}

これの問題は、独自のバージョンのServiceを初期化するため、コードの変更に合わせて調整することが非常に難しくなることです(つまり、Serviceを別のものと交換したい場合)。また、テストが困難になります。

これを解決するには、実際に自分で作成するのではなく、外部から取得します。

public class Sample
{
  Service a;

  public Sample(Service aService)
  {
    a = aService;
  }
}

これでクラスから作成を取り除いたので、外部からそこに配置するだけで、テスト性と保守性が向上します。ただし、クラスServiceへの依存関係はまだ残っています。あなたはその特定のクラスに本当に興味はありませんが、それが提供する振る舞いに興味があります-それであなたはそれからインターフェースを作ります。

public class Sample
{
  IService a;

  public Sample(IService aService)
  {
    a = aService;
  }
}

これで、サービスを好きなものに置き換えることができます。たとえば、サービスを使用してサーバーからデータを取得するクラスがあるとします。ここで、データフェッチサービスではなく、データ解析のみをテストしたい-静的データを提供するインターフェースを実装するクラスを作成するだけ-完了!

さて、Unityが登場します。現時点では、依存関係を自分で解決する必要があります。単一性は単純です-依存性のあるすべてのクラスを取得してそれらを解決します-したがって、呼び出すことができます(疑似コード、単一性はわかりません):

UnityContainer uc = new UnityContainer();
var a = uc.GetService<IService>();

そして、それはあなたにすぐに使えるクラスを与えます。

それによって私たちは何を達成しましたか?

  • 特定の型に依存しないため、コードはより保守しやすくなります
  • コードはよりテスト可能です
  • アプリケーションは簡単に拡張できます

要約すると、より良いアプリケーションをより速く作成するのに役立ちます。

52
Femaref

Unityコンテナーはcookieがいっぱい入ったjarのようなもので、cookieが必要なときは、jarにcookieを提供するように要求するだけです。

各クッキーには、あなたがクッキーを手に入れることができるようにいくつかの美徳がありますが、食べるのが非常に難しいのでそれを食べることはできません(シングルトンのようなもの)

あなたのお母さんが新しいCookieを作成すると、彼女は直接あなたに与えるのではなく、そのCookieをjarファイルに入れます。

37
TalentTuner

ご覧になることをお勧めします Mike Taulty's Prismビデオシリーズ

最初の2つの章はあなたの質問に答えます、そしてあなたはプリズムを学ぶために他の章を見ることができます(バージョン2とかなり古いですが、基本的な原則は同じです...)

幸運を :)

7
ET.