present@わんくま

本家はこちら

目次

Blog 利用状況

ニュース

アクセサリ

書庫

日記カテゴリ

ギャラリ

リンク

UnityContainer に登録したインスタンスを取り出す

はじめに

仕事で Unity を試す機会ができたので、やったことをエントリにしていきます。

今回は構成ファイルを使っていません。依存性も注入していません。DI コンテナに登録したインスタンスを取り出すだけの簡単なサンプルです。

まずインタフェースを用意

DataSet を取得するメソッドのみ定義します。

public interface IMasterManager
{
    DataSet Read();
}

インタフェースを実装するクラスを複数用意

得意先・仕入先・商品の3種類を用意します。

// 得意先用
public class CustomerManager : IMasterManager
{
    public DataSet Read()
    {
        return new DataSet("Customer");
    }
}

// 仕入先用
public class SupplierManager : IMasterManager
{
    public DataSet Read()
    {
        return new DataSet("Supplier");
    }
}

// 商品用
public class ProductManager : IMasterManager
{
    public DataSet Read()
    {
        return new DataSet("Product");
    }
}

名前の付いた空の DataSet を返しているだけです。

参照するアセンブリを追加します

次の2つを追加します。

  • Microsoft.Practices.Unity.dll
  • Microsoft.Practices.ObjectBuilder2.dll

UnityContainer を使ってみます

static void Main(string[] args)
{
    // DI コンテナを生成
    var container = new UnityContainer();

    // 名前を指定してインスタンスを登録
    container.RegisterInstance<IMasterManager>("Customer", new CustomerManager());
    container.RegisterInstance<IMasterManager>("Supplier", new SupplierManager());

    // 名前を指定せずにインスタンスを登録
    container.RegisterInstance<IMasterManager>(new ProductManager());

    // 得意先を取得
    IMasterManager manager = container.Resolve<IMasterManager>("Customer");
    Console.WriteLine(manager.Read().DataSetName);

    // 仕入先を取得
    manager = container.Resolve<IMasterManager>("Supplier");
    Console.WriteLine(manager.Read().DataSetName);

    // 名前を指定せずにインスタンスの取得を試みる
    manager = container.Resolve<IMasterManager>();
    Console.WriteLine(manager.Read().DataSetName);

    Console.ReadLine();
}

このコードを実行すると次の結果が出力されます。

ちなみに、すべてのインスタンスが名前を指定して登録されていた場合、

manager = container.Resolve<IMasterManager>();

のところで例外が発生します。

また、ResolveAll で複数のインスタンスを取得できます!

static void Main(string[] args)
{
    // DI コンテナを生成
    var container = new UnityContainer();

    // 名前を指定してインスタンスを登録
    container.RegisterInstance<IMasterManager>("Customer", new CustomerManager());
    container.RegisterInstance<IMasterManager>("Supplier", new SupplierManager());

    // 名前を指定せずにインスタンスを登録
    container.RegisterInstance<IMasterManager>(new ProductManager());

    // 登録したインスタンスの中から IMasterManager を実装するものをすべて取得する
    IEnumerable<IMasterManager> managers = container.ResolveAll<IMasterManager>();
    foreach (IMasterManager manager in managers)
    {
        Console.WriteLine(manager.Read().DataSetName);
    }

    Console.ReadLine();
}

このコードの実行すると次の結果になります。

名前を指定せずに登録したインスタンスは取得されません。

最後に

今回は Unity Container に登録したインスタンスを取得しただけでした。まだ依存性を注入していませんね。

次はコードで依存性を注入してみます。

投稿日時 : 2008年10月28日 0:46

コメントを追加

# Unity を使ってコードで依存性を注入する 2008/10/29 11:44 Nakamura Blog

Unity を使ってコードで依存性を注入する

# mgtyiEVmDs 2011/12/16 2:07 http://www.healthinter.org/health/page/actonel.php

Yeah? I read and I understand that I do not understand anything what it is about:D

# オメガ 一覧 2017/06/20 14:58 wwglsgdjq@ezweb.ne.jp

◆ スタイルが多い、品質がよい、価格が低い!
● SS品質 シリアル付きも有り 付属品完備!
◆ 必ずご満足頂ける品質の商品のみ販売しております.
● 品質を最大限本物と同等とする為に相応の材質にて製作している為です.
◆ 絶対に満足して頂ける品のみ皆様にお届け致します.
人気の売れ筋商品を多数取り揃えております。
全て激安特価でご提供.お願いします.
オメガ 一覧 http://www.watchsjp.com

# A品コーチ 2017/07/27 18:44 texgldc@icloud.com

特恵中-新作入荷!
当社の商品は絶対の自信が御座います
迅速、確実にお客様の手元にお届け致します
実物写真、付属品を完備しております。
低価格を提供すると共に、品質を絶対保証しております
ご注文を期待しています

# Heya i аm for the firѕt time hеre. I found thiѕ board ɑnd I fіnd It truly usеful & іt helped me out mսch. I hope tоo give sometһing back and help ⲟthers ⅼike yοu helped mе. 2017/12/04 9:45 Heya i am for the fіrst time һere. I found tһis bo

Heya i am fοr the first time here. I found this board and I find ?t tr?ly useful &
iit helped me out m?ch. I hope t? give something back
and hеlp ?thers like you helped me.

# Someboɗy neсessarily lend a hɑnd to make seriously posts I wⲟuld stɑtе.This iѕ the very fіrst time I frequened yⲟur weeb page annd thus faг? I amazed wіtһ the analysis you made to make thiѕ actual put ᥙp extraordinary. Fantastic activity! 2018/01/17 14:34 Sοmebody neϲessarily lend a һаnd tօ make sеriously

?omebody ne?essarily lend a hand t? make serio?sly posts I woul? state.
Τh?s ?s the vеry f?rst t?me I frequented youг web
page ?nd t?us f?r? ? amazed with t?е analysis you made to make th?s actual рut uρ extraordinary.
Fantastc activity!

# ロレックス 値段 高い 2022/07/30 21:33 qmldyjw@yahoo.co.jp

もう何度、お世話になっているのでしょう。
安心してお買い物ができるってこの上ない幸せです。
ブシュロン ネックレスをセール価格で販売中♪ブシュロン ネックレス キャトル クラシック YG WG PG フォーカラー 新品 ミニ ペンダント チョーカー ペンダントトップ
可愛ぃぃ(^^♪
予想していたより小さかったけど、可愛かったので、満足してます。

タイトル
名前
URL
コメント