【Unity】RegisterType : 静的な情報を登録する。

  • 2009.02.21 Saturday
  • 06:40
TODO: 全体的に間違っているので修正する予定

--------------------------------------------------------------

Unity RegisterType

Source and Project

DIコンテナというフレームワークが提供する機能は

・静的な情報と動的な情報を管理する機能
・静的な情報から動的な情報を構築する機能


と考えることができます。

Unity Application Blockが提供するResigterTypeメソッドは静的な情報をDIコンテナに登録する機能を提供します。似たメソッドとしてResigterInstanceメソッドというのもあり、こちらは静的な情報を設定することも可能ですが、動的な情報を直接DIコンテナに登録することもでき少し特殊です。

今回はResigterTypeメソッドに関して少しまとめてみたいと思います。

-----------------------------------------------------
RegisterTypeメソッドから見る継承関係の登録と管理概念。

RegisterTypeをブラックボックスおよびホワイトボックスの双方から検証し
依存関係の登録方法と登録された依存関係の管理概念を考察してみました。

DIコンテナに登録される静的な情報を列挙してみると

1.継承関係(is-a)(※自分自身もありうる。)
2.関連関係(has-a)または依存関係(use)
3.その他(1と2から生成されたインスタンスの管理方法など)


Unity Application Blockではこれらの情報の設定をXMLファイルとコードのどちらかでも設定可能で、かつ設定情報自体をオブジェクト化しているため動的に変更が可能であることが特徴です。今回とりあげるRegisterTypeメソッドの役割はis - a の関係を登録する部分(1)と、インジェクションの設定(2)、それからインスタンス化されたオブジェクトの管理方法の登録を行う責務(3)を担っています。Unityでは、(1)(2)(3)の設定を名前で管理します。この名前はユニークであり、動的変化に対応するため、重複する名前は後勝ちになります。Unityでは名前付けの特殊なケースとして無名が存在します。無名に対しても普通の名前と同様にis - aの関係を1つ対応しており他の名前と同等な重みで扱われ、無名と無名でない名前に対しての優先順位は存在しません。つまり、該当する名前がなかったから無名な関係を結果として返すなどといった仕組みは存在しません。

たとえば、

名前 A - 関係 (HogeImpl is a IHoge)
名前 B - 関係 (HogeImpl is a IHoge)
名前 C - 関係 (HogeAImpl is a IHoge)
名前 無名 - 関係 (HogeAImpl is a IHoge)

下記のより無名は無名ととして他のA、B、Cと同列で扱われているので
Aを検索すると IHoge - HogeImpl が名前指定なしで検索すると、無名という名前で検索されIHoge - HogeAImplがという具合に考えることができます。

コード中に無名そのものの対してNullオブジェクトは存在しませんが、
結果的にはNullオブジェクト的な振る舞いをしているといえると思います。

よって下記のコードでは

 class Program
 {
  static void Main()
  {
   IUnityContainer container = new UnityContainer();
   container.RegisterType<IHoge, HogeAImpl>("A");
   container.RegisterType<IHoge, HogeBImpl>();
   container.RegisterType<IHoge, HogeCImpl>();

   container.Resolve<IHoge>().Execute();
   container.Resolve<IHoge>("A").Execute();
  }
 }

 public interface IHoge
 {
  void Execute();
 }

 public class HogeAImpl : IHoge
 {
  public void Execute()
  {
   Console.WriteLine("A");
  }
 }

 public class HogeBImpl : IHoge
 {
  public void Execute()
  {
   Console.WriteLine("B");
  }
 }

 public class HogeCImpl : IHoge
 {
  public void Execute()
  {
   Console.WriteLine("C");
  }
 }

Unity RegisterType

無名で登録が2行あります。

   container.RegisterType<IHoge, HogeBImpl>();
   container.RegisterType<IHoge, HogeCImpl>();

これは無名という名前で登録することになり、最初の関係は
後の登録によって上書きされてしまいます。

よって

container.Resolve<IHoge>().Execute();

無名での呼び出しはHogeCImplが呼び出されることになります。

また下記のように無名の登録をしないまま

  static void Main()
  {
   IUnityContainer container = new UnityContainer();
   container.RegisterType<IHoge, HogeAImpl>("A");
   //container.RegisterType<IHoge, HogeBImpl>();
   //container.RegisterType<IHoge, HogeCImpl>();

   container.Resolve<IHoge>().Execute();
   container.Resolve<IHoge>("A").Execute();
  }

無名で呼び出すと実行時に例外が発生します。

例外メッセージの一部
Resolution of the dependency failed, type = "Art55.UnityDemo20090218_001.IHoge", name = ""

無名で登録されている依存関係がみつかりませーんって言っていることがわかります。

ではまとめます。

DIコンテナの継承関係(is - a)の登録は名前で管理される。
ただし、名前指定なしの場合は無名としてひとつの設定となる。


以上

Source and Project

------------------
誤解を招く表現があったため、編集しました。
コメント
管理者の承認待ちコメントです。
  • -
  • 2018/04/02 2:54 PM
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< December 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM