【WPF】【Unity】コンテナからのインスタンスの提供方法を決定するオブジェクト。
- 2009.02.17 Tuesday
- 21:42
先日からUnity Application Blockを取り上げてBlogに書いております。そもそもUnity Application Blockを試してみたいと思ったのは3度目でして、一発目は6月か7月あたり、これは人づてに噂を聞いたからで、それまでDIコンテナはSeasar.NETしか触ったことがなかったので興味をしてしていたのですが、WPFの触っている方が楽しかったので、煙もただずな状態でした、それから「Composite Application Library」に興味を持った去年の10月ごろ、ちょっとサンプルコード書いて終わりでした。ということで今回が三度目の正直なのですが!!
目から鱗が取れました!
DIコンテナに型の関係を登録するメソッド(RegisterType)を呼び出す際に、LifetimeManagerというオブジェクト渡すようになっています。このLifetimeManagerは抽象クラスなので、インスタンスを生成するにはどうすればよいのか調べてみました。まずは、調べた結果をまとめたクラス図を見てみると
(拡大版)
IBuilderPolicyインターフェイスを継承するILifetimePolicyインターフェイスがあります。そのILifetimePolicyを継承するのがLifetimeManager抽象クラスです。
LifetimeManager抽象クラスからの継承関係を図にしたのが、上記のクラス図になります。
インスタンス化できるLifetimeManagerは下記のとおり
※ContainerLifetimeManagerというのもいます。
私のつたない英語力で翻訳してしまうと嘘を書いてしまう恐れがあるのであえて翻訳はしませんが、ものすごく簡単な英語なのでエキサイ・・・いやいや、ふつうに読めますね。DIコンテナが管理するインスタンスのライフタイムを管理するオブジェクトがLifetimeManagerということが大体読み取れます。
これらを平たく言えば
ExternallyControlledLifetimeManager
呼び出した場所のスコープ範囲のライフライムを持つインスタンスを生成する。インスタンスがGCに回収されない限りは、DIコンテナは同一のインスタンスを返す。
PerThreadLifetimeManager
Thread毎のSingleton。
TransientLifetimeManager
単なるFactoryMethod。インスタンスをDIコンテナに要求する度にインスタンスを生成する。new するのと同じ動き。
ContainerControlledLifetimeManager
プロセス単位のSingleton(←間違ってるかもしません)。コンテナ単位で1インスタンス。 IDisposableを実装しているのが特徴。
と、私の狭い知識で知っているDIコンテナのライフタイムと同じような設定が可能なようです。ただし、Unity Application Blockはこれからがすごい!目から鱗です。
ライフタイムを管理するマネージャーがオブジェクト化されている
という点が素晴らしいアイデアだと私は感動しました。DIコンテナの設定情報をどうするか、XAML?属性?なんていう議論が巷ではあるようですが、この設定情報の一部にライフタイムというのが上げられると思います。なんちゃってXMLで記述してみると
<Hoge LifeTime="Singleton">
<ClassType>...</ClassType>
</Hoge>
みたいな書き方をされると思いますが、LiftTimeは属性値として定義され、要するに静的な単なる値です。これが、Unity Application Blockで提供するライフタイムの管理というのは、明確な境界をもったオブジェクトとして具象化され、アプリケーションの実行中にマネージャーオブジェクトが持つ機能や状態によりDIコンテナの振る舞いや、管理されているインスタンスに影響を与える仕組みが提供できるポテンシャルを持っているということになります。後者は難しいと思いますが(笑)
なのでこのライフタイムのパラダイムの変化は私にとって目からうろこでした。
以上。力説してしまいました。
目から鱗が取れました!
DIコンテナに型の関係を登録するメソッド(RegisterType)を呼び出す際に、LifetimeManagerというオブジェクト渡すようになっています。このLifetimeManagerは抽象クラスなので、インスタンスを生成するにはどうすればよいのか調べてみました。まずは、調べた結果をまとめたクラス図を見てみると
(拡大版)
IBuilderPolicyインターフェイスを継承するILifetimePolicyインターフェイスがあります。そのILifetimePolicyを継承するのがLifetimeManager抽象クラスです。
LifetimeManager抽象クラスからの継承関係を図にしたのが、上記のクラス図になります。
インスタンス化できるLifetimeManagerは下記のとおり
1.ExternallyControlledLifetimeManager
A that holds a weak reference to it's managed instance.
2.PerThreadLifetimeManager
A that holds the instances given to it, keeping one instance per thread.
3.TransientLifetimeManager
An implementation that does nothing, thus ensuring that instances are created new every time.
4.ContainerControlledLifetimeManager
A that holds onto the instance given to it.When the is disposed, the instance is disposed with it.
※ContainerLifetimeManagerというのもいます。
私のつたない英語力で翻訳してしまうと嘘を書いてしまう恐れがあるのであえて翻訳はしませんが、ものすごく簡単な英語なのでエキサイ・・・いやいや、ふつうに読めますね。DIコンテナが管理するインスタンスのライフタイムを管理するオブジェクトがLifetimeManagerということが大体読み取れます。
これらを平たく言えば
ExternallyControlledLifetimeManager
呼び出した場所のスコープ範囲のライフライムを持つインスタンスを生成する。インスタンスがGCに回収されない限りは、DIコンテナは同一のインスタンスを返す。
PerThreadLifetimeManager
Thread毎のSingleton。
TransientLifetimeManager
単なるFactoryMethod。インスタンスをDIコンテナに要求する度にインスタンスを生成する。new するのと同じ動き。
ContainerControlledLifetimeManager
と、私の狭い知識で知っているDIコンテナのライフタイムと同じような設定が可能なようです。ただし、Unity Application Blockはこれからがすごい!目から鱗です。
ライフタイムを管理するマネージャーがオブジェクト化されている
という点が素晴らしいアイデアだと私は感動しました。DIコンテナの設定情報をどうするか、XAML?属性?なんていう議論が巷ではあるようですが、この設定情報の一部にライフタイムというのが上げられると思います。なんちゃってXMLで記述してみると
<Hoge LifeTime="Singleton">
<ClassType>...</ClassType>
</Hoge>
みたいな書き方をされると思いますが、LiftTimeは属性値として定義され、要するに静的な単なる値です。これが、Unity Application Blockで提供するライフタイムの管理というのは、明確な境界をもったオブジェクトとして具象化され、アプリケーションの実行中にマネージャーオブジェクトが持つ機能や状態によりDIコンテナの振る舞いや、管理されているインスタンスに影響を与える仕組みが提供できるポテンシャルを持っているということになります。後者は難しいと思いますが(笑)
なのでこのライフタイムのパラダイムの変化は私にとって目からうろこでした。
以上。力説してしまいました。