- PR -

diconファイル内でキャストできる?

1
投稿者投稿内容
cyanberry
常連さん
会議室デビュー日: 2005/01/07
投稿数: 37
投稿日時: 2006-11-24 12:07
seaser2で使われるdiconファイルの記述方法について質問があります。

下記のような感じで、diconファイルのコンポーネントの定義でコンストラクタの引数をキャストしたいのですが、下記のような記述方法はダメなようです。


<component name="aaacmp" class="AaaClass">
  <arg>(java.lang.String)bbbcmp.getObject</arg>
</component>


diconファイル内でキャストはどのように記述したらよいのでしょうか。
または、できないものなのでしょうか。

ご存知の方ご教授ください。
よろしくお願いいたします。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-11-24 13:06
試したことないですけど、
コード:
<component name="aaacmp" class="AaaClass">
  <arg>bbbcmp.getObject().toString()</arg>
</component>


とかはどうでしょうかね、ダメかな?。
cyanberry
常連さん
会議室デビュー日: 2005/01/07
投稿数: 37
投稿日時: 2006-11-24 14:15
回答ありがとうございます。

例文はあくまで例で、ObjectをStringにキャストしたいというわけではないので・・・。純粋にキャストの書き方を知りたいのです。

また、「そういう型を返すメソッドを作ればいいじゃないか」といわれればそれまでなのですが、もしdicon内でキャストする方法があれば、そのほうが設計的にすっきりするので、できることならdiconの記述でキャストを実現したいのです。

よろしくお願いいたします。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-11-24 16:08
引用:

dicon内でキャストする方法があれば、そのほうが設計的にすっきりするので、できることならdiconの記述でキャストを実現したいのです。


キャストですか、うーん、どうもDIコンテナらしからぬ使い方をしているような気が
するのですが。diconファイル内の設定は、あくまでも「Injectionする実装はこれです
よ」ということを設定することを目的としていると思うので、そこにキャストを持ち込む
のはいかがなものかと思います。多分なんですが、もともとそのクラスが持ちえる情報
を元に(リフレクションで)Injection処理を行うコンテナの設定に、元々持ち得ない
インターフェースを無理矢理キャストで定義しても、Injection処理の手がかりが無い
から、処理できないのは当たり前のような気がします。(Seasar2はVMコードの書き換え
をしていると記憶してます)

DIコンテナ向けではない、すっきりしない設計をしてらっしゃいませんか?。


nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-24 17:33
引用:

cyanberryさんの書き込み (2006-11-24 14:15) より:
もしdicon内でキャストする方法があれば、そのほうが設計的にすっきりするので、できることならdiconの記述でキャストを実現したいのです。



私も設計が怪しいに1票。

か、もしくはよほど特殊なやむにやまれぬ事情があるのか…
外部で提供されている戻り値がObject型のメソッドを使わねばならない、
といった状況?いやいやいや…

interfaceで型を決めるのは「契約に基づくプログラミング」のためですよね。
DIって型は決まっているけど実装は不定なのを自由に切り替えられるのがメリットなのでは。
その型をあいまいにしてしまうってのは本質的な思想が違うように思います。
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2006-11-25 04:01
引用:

小僧さんの書き込み (2006-11-24 16:08) より:
引用:

dicon内でキャストする方法があれば、そのほうが設計的にすっきりするので、できることならdiconの記述でキャストを実現したいのです。


キャストですか、うーん、どうもDIコンテナらしからぬ使い方をしているような気が
するのですが。diconファイル内の設定は、あくまでも「Injectionする実装はこれです
よ」ということを設定することを目的としていると思うので、そこにキャストを持ち込む
のはいかがなものかと思います。


1年程前にS2を使用しましたが同感ですね。
diconにJavaらしく書ける(設定できる)からといって、
実際はコンパイル時の手掛かりを記述してるのに過ぎないはずです。
diconを解析する部分で「( )」が意味を持つかどうかは、
中を見てみないとなんとも言えないですね。

#追記
#diconの設定を考えると
#bbbcmpにキャストしたいクラスを返すメソッドを作成するのが
#シンプルかと思います。

##(クラスとしての)Objectを引数の型にすればreflectを使用してdiconに書けるかも・・

[ メッセージ編集済み 編集者: kuma 編集日時 2006-11-25 05:50 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-11-26 01:21
そもそもOGNLにキャストの構文なんてないはず。
OGNL式を直に使う場合も、評価結果を返すメソッドはObject型。
つまり、OGNL式内でキャストする意味が全くないです。

Seasar2用のOGNL式はOGNLに用意されている機能をそのまま使っているだけです。
(最近のバージョンは知りませんが。)

回答とは関係ありませんが、特定のフレームワークに関する質問は、
それらのMLなどに投げた方が、的確なレスポンスが得られると思いますよ。
特にSeasarに関しては、コミッタの方々が積極的に回答してくれると思います。
cyanberry
常連さん
会議室デビュー日: 2005/01/07
投稿数: 37
投稿日時: 2006-11-30 17:59
皆さん回答ありがとうございました。
レスポンスが遅れて申し訳ありません。

diconでのキャストの記述はやはり無理なようですね・・・。
直すならJavaのほうということですね。

皆さんのおっしゃるとおり、設計的にはよろしくないのかもしれませんが、diconの修正だけで済むと作業量が少なくて済むので、質問させていただきました。

次新しいものを作るときは、皆さんの意見を考慮に入れて設計したいと思います。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)