[seasar-dotnet:656] Re: QuillのインスタンスモードとDIのタイミングに関して

Kazuya Sugimoto [E-MAIL ADDRESS DELETED]
2007年 11月 19日 (月) 14:37:34 JST


杉本です。

普通に定義したコンポーネントの場合、コンテナを作成したタイミングでDiconに
定義されたコンポーネントがコンテナに登録されます。そしてコンテナの初期化を
行うとsingletonのコンポーネントのインスタンスが初期化されます。

自動登録の場合はコンテナの初期化時にAutoRegisterのRegisterAllメソッドが
呼ばれてそのメソッドの中でコンポーネントの登録が行われます。

RegisterAllメソッドが呼ばれるまではインスタンス化どころかコンポーネントすら
コンテナに登録されていません。インスタンスは必要とされたときに作成され
DIが行われます。

そのためコンテナが初期化されるまでは、自動登録のものはコンポーネント定義
すらコンテナに存在していないので、自動登録されたコンポーネントを利用する
場合は、設定の順番が重要となるのです。


07/11/15 に marron Hnoss<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 栗田です。
>
>  確かにそれだとできそうですね。
> >S2ContainerのコンポーネントをとってきてDIする処理
>
> 少しずれてしまうのですが、わからないことがあります。
> diconにコンポーネントを記述する際は特に順序を気にせず
> 記述しておけば内部的にDIが自動でされるのかなと思って
> いたのですが、自動コンポーネント登録の場合は順序が
> 関係するとあります。自動コンポーネント登録の場合は
> コンポーネント群を登録してDI、次のコンポーネント群を
> 登録してDIしていて、SeasarのInit処理はコンポーネント
> 全てを登録してからDIをしている違いでしょうか?
> 全然違うことを言ってたらごめんなさい;
>
> 07/11/15 に Kazuya Sugimoto <[E-MAIL ADDRESS DELETED]> さんは書きました:
> > 杉本です。
> >
> > 最終的にBinding属性が無くてもプロパティがあれば、そこにS2Containerの
> > コンポーネントをDIしたいということですよね。
> >
> > それならばQuillInjectorを改造(継承して拡張)するのが1番早いかもしれません。
> >
> > QuillInjectorの115行目でフィールドを取得して、それに対してInjectする
> > 部分があるのですが、その後ろにプロパティを取得して、S2Containerの
> > コンポーネントをとってきてDIする処理を追加する感じでどうでしょうか?
> >
> >
> > 07/11/15 に marron Hnoss<[E-MAIL ADDRESS DELETED] > さんは書きました:
> > > こんばんわ。栗田です。
> > >
> > > S2側がインスタンスを作成するタイミングがQuillのコンポーネントを
> > > 認識した後でやりくりしてくれるような仕組みができたら良いのかなと
> > > 思いました。もしくはQuill側がdiconとImplementation属性部分の
> > > コンポーネントに対してインスタンスを作成しコンテナに登録すれば
> > > うまくいくかもしれません。
> > >
> > > Bindingを使って開発を行うとした場合は(DBFlute自動生成とは別ですが)
> > > Quillを使用する場合はS2管理のコンポーネントはGetter/Setterを用意ではなく、
> > > Bindingを使うようにして、Quill管理ではないところはGetter/Setterで
> > > 大丈夫ということを意識しないといけませんね。
> > >
> > > >BhvImplをインスタンス属性outerとしてS2Containerに自動登録すると
> > > >いうのはどうでしょうか?
> > > >どこかでIS2Container.InjectDependencyを呼び出す仕組みが必要ですし、
> > > >Diconへの登録は避けられずちょっと大げさな感じですが・・
> > >
> > > この場合だとS2の管理でBhvImplを使ったほうが良いかもしれませんね。
> > >
> > > なかなか悩ましいです;
> > >
> > > 07/11/14 に Kazuya Sugimoto <[E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > 杉本です。
> > > >
> > > > そうですね。Biding属性がS2Containerのコンポーネントをバインドするための
> > > > 機能なのでそれが1番だと思います。
> > > >
> > > > 他の手段としては、BhvImplのインスタンスをあくまでQuillで管理するというので
> > > > あれば、BhvImplをインスタンス属性outerとしてS2Containerに自動登録すると
> > > > いうのはどうでしょうか?
> > > >
> > > > どこかでIS2Container.InjectDependencyを呼び出す仕組みが必要ですし、
> > > > Diconへの登録は避けられずちょっと大げさな感じですが・・
> > > >
> > > >
> > > > 07/11/14 に marron Hnoss< [E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > > To:杉本さん
> > > > >
> > > > > 栗田です。早速の返信ありがとうございます。
> > > > >
> > > > > 2.についてですが、
> > > > >
> > > > > 具体的に例を挙げると、
> > > > > DBFluteを利用して、自動生成を行いました。その際に、
> > > > > BhvImpl関連のコンポーネントの定義をdiconから削除し、
> > > > > 変わりにBhvインターフェースに対してImplementation属性を追加しました。
> > > > > BhvImplの中にはDaoのGetter/Setterが用意してあります。diconに
> > > > > Daoのコンポーネントは登録してある状態となります。
> > > > >
> > > > > このとき、S2のInit処理を行い、その後QuillでInject処理を行います。
> > > > > QuillでInjectしたクラスの中にpublic Bhv bhv;
> > > > > というような定義をしておくと、このbhvに関してはインスタンスが取得できますが、
> > > > > Daoはnullでした。そして、DaoをBindingした場合はインスタンスを取得できました。
> > > > >
> > > > > S2のInit処理のときにdiconのコンポーネントのインスタンスを作成しますが、
> > > > > Quillのコンポーネントに関してはインスタンスを作成しません。この
> > > > > Quillのコンポーネントの中でDaoが使われているので、Getter/Setterを準備しておいても
> > > > >
> QuillのInject処理ではこの部分はDIされません。(Daoのインスタンスに関してはコンテナに存在)
> > > > > Bindingに関してはGetComponentをしにいくので取得できるという状態だと思います。
> > > > >
> > > > > 一つはBindingで対応するという案があります。
> > > > > その他で、S2のInit処理のときに、QuillのコンポーネントのDI部分にも対応できるような
> > > > > 処理を行いたい。
> > > > > おそらく、Quillのコンポーネントを先に作って、これをS2のInit処理のときに認識させれば
> > > > > 良いとすると、Quillのコンポーネントもdiconに定義が必要になる?そうするとあまり
> > > > > 嬉しくないかなぁ...。というような状態です;この周りをうまくできるような良い方法
> > > > > はないかと考えています。
> > > > >
> > > > > 長文になってしまい申し訳ありません。
> > > > >
> > > > > 1.に関しても、まとまりましたらまた投稿させていただきます。
> > > > >
> > > > > よろしくお願いします。
> > > > >
> > > > > 07/11/14 に Kazuya Sugimoto <[E-MAIL ADDRESS DELETED] > さんは書きました:
> > > > > > 栗田さん、こんにちは。
> > > > > >
> > > > > > 杉本です。
> > > > > >
> > > > > > まず1についてですが、開発ポリシーからすぐにprototype対応というのは
> > > > > > 行えません。ただしそこに固執している分けではないので、要望としてしっかり
> > > > > > 受け止め、将来対応するか検討したいと思います。
> > > > > >
> > > > > > ちなみに「便利な点が多々」ということですので、そのケースを具体的に教えて
> > > > > > 頂きましたら、検討する際に助かります。
> > > > > >
> > > > > > 2についですが、「2.DI処理」というのは、S2Containerの初期化(Init)を指すので
> > > > > > しょうか?
> > > > > >
> > > > > > QuillのBinding属性でS2Containerのコンポーネントを指定した場合でも、
> > > > > > S2Containerには影響を及ぼさないので、S2Containerのコンポーネントが
> > > > > > 初期化(Init)時にインスタンスが生成されないということはありません。
> > > > > > (S2Containerのコンポーネントがsingletonの場合)
> > > > > >
> > > > > > ちょっと2については意図を汲み取れている自信がないので、私が間違った
> > > > > > 理解をしてそうな感じであれば、もう少し説明をお願いします。m(_ _)m
> > > > > >
> > > > > >
> > > > > >
> > > > > > 07/11/14 に marron Hnoss< [E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > > > > いつもお世話になっております。栗田と申します。
> > > > > > >
> > > > > > > 現在の仕事でQuillを使用できないかを検討しております。
> > > > > > > そこで2点お伺いしたいことがあります。
> > > > > > > 1.インスタンスモードがステートレスな業務ロジックを構築することを目的となっている
> > > > > > >
> ためにsingletonのみということですが、protptypeも対応して頂けたら、便利な点が多々
> > > > > > > あるため、ありがたいと考えております。
> > > > > > >
> > > > > > >
> 2.現在S2ContainerのInit処理を行いQuillのコンポーネント登録およびインスタンス作成
> > > > > > > 処理を行うと、
> > > > > > >  1.S2のコンポーネント登録
> > > > > > >  2.DI処理
> > > > > > >  3.Quillのコンポーネント登録
> > > > > > >  4.Quill側のインスタンス作成
> > > > > > > (間違っていたら申し訳ありません)
> > > > > > >
> というようになっていると考えており、Quillのコンポーネント内でdiconでDIしているような
> > > > > > > コンポーネントは、2のDIでは識別されていないためインスタンスが作成されないと思います。
> > > > > > > よって、BIndingを使用してGetComponent処理を行っていると思うのですが、
> > > > > > > この部分のやり取りを、
> > > > > > >  1.S2のコンポーネント登録
> > > > > > >  2.Quillのコンポーネント登録
> > > > > > >  3.DI処理
> > > > > > > というように行えないかと考えております。何か良いアイデアなどがありましたら
> > > > > > > よろしくお願い致します。
> > > > > > >
> > > > > > >
> > > > > > > _______________________________________________
> > > > > > > seasar-dotnet mailing list
> > > > > > > [E-MAIL ADDRESS DELETED]
> > > > > > >
> > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Kazuya Sugimoto
> > > > > > Microsoft MVP Visual Developer - Solutions Architect
> > > > > > http://d.hatena.ne.jp/sugimotokazuya/
> > > > > > _______________________________________________
> > > > > > seasar-dotnet mailing list
> > > > > > [E-MAIL ADDRESS DELETED]
> > > > > >
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > > > > >
> > > > >
> > > > >
> > > > > _______________________________________________
> > > > > seasar-dotnet mailing list
> > > > > [E-MAIL ADDRESS DELETED]
> > > > >
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > > > >
> > > > >
> > > >
> > > >
> > > > --
> > > > Kazuya Sugimoto
> > > > Microsoft MVP Visual Developer - Solutions Architect
> > > > http://d.hatena.ne.jp/sugimotokazuya/
> > > > _______________________________________________
> > > > seasar-dotnet mailing list
> > > > [E-MAIL ADDRESS DELETED]
> > > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > > >
> > >
> > >
> > > _______________________________________________
> > > seasar-dotnet mailing list
> > > [E-MAIL ADDRESS DELETED]
> > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > >
> > >
> >
> >
> > --
> > Kazuya Sugimoto
> > Microsoft MVP Visual Developer - Solutions Architect
> > http://d.hatena.ne.jp/sugimotokazuya/
> > _______________________________________________
> > seasar-dotnet mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >
>
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>


-- 
Kazuya Sugimoto
Microsoft MVP Visual Developer - Solutions Architect
http://d.hatena.ne.jp/sugimotokazuya/


seasar-dotnet メーリングリストの案内