ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

monorail-RC3 が mono1.2.4上で動いた

Sunday, 21 September 2008 07:52 by sabro

複数のエラーが複雑に絡み合って大変でしたが、とりあえずDBからデータをとってきて、それをページに表示するところまで来ました。まだ、画像が一部表示されなかったり、おかしな部分もありますが、まあなんとかなるかな。

とりあえず、ハマッタ部分を列挙しときます。

1.AspView上でのViewComponent
MonorailのViewEngineの一つ、AspViewを使っているのですが、このエンジン上でViewComponentを使う時は引き渡す値がNullだといけないようです。たまたまNullを渡してしまうロジックがあったので、空のオブジェクトをデフォルトで生成しておくよう修正しました。
2.MysqlDataReader.GetValueの仕様
MysqlDataReader.GetValueで、DBの値をオブジェクトとして取得したものを、リフレクションでオブジェクトのフィールドにセットしていたのですが、その際実行される暗黙的キャスト処理が、Windows上では動作するがMono上では動作せず「Unknown target conversion type」とエラーが出ていました。これはメチャクチャ嵌ったんですが、MysqlDataReaderのドキュメントを見ると、以下のような文が書いてありました。
For optimal performance, MySqlDataReader avoids creating unnecessary objects or making unnecessary copies of data. As a result, multiple calls to methods such as GetValue(Int32) return a reference to the same object. Use caution if you are modifying the underlying value of the objects returned by methods such as GetValue.
どうやら、DBから同じ値を取得した場合、2回目は前回取得した値の参照を返すようで、おそらくこれのせいでキャストが失敗したのではないかと考えています(あくまで予想です)。対策として、データを取得する際、明示的にGetStringやGetInt32などを使用することで回避できました。
3.Enumのフィールドにリフレクションで値セット時の挙動
前述のとおり、DBからとってきたデータは、リフレクションでオブジェクトのフィールドにマッピングしています。Enumフィールドに対してDBの数値型のカラムから取得した値をセットした場合、Windowsでは問題なくキャストしてくれるのですが、Monoではエラーになっていました。Enum.ToObjectを使用してリフレクションの前にEnumオブジェクトに変換しておくと、うまく動作しました。まあEnumに数値を割り当てる時は通常はキャストが必要なのでこれは仕方ないかもしれません。
4.フォルダ名の大文字、小文字
Windows上で正しく動作しているからフォルダ名の大文字、小文字は気にしてなかったのですが、Linuxでは当然これらを区別するので、プログラムから指定するパスと実際のディレクトリが正確に一致していないと、ファイルが見つからないことになります。javascriptが入っているフォルダが見つからないなーと思ったらこれが原因でした。
5.AspViewのディレクトリ区切り文字列
ViewEngineのAspViewがSubViewのあるディレクトリを探す際に、環境に合わせた区切り文字を取得できるPath.DirectorySeparatorCharを使わず、"\"をディレクトリ区切り文字列として使用していました。これでは当然Windowsでしか動きません( ̄□  ̄ || 作者のブログに慣れない英語でコメントしてみたのですが、Mono環境を持ってないのでテストできないそうです。逆によかったらパッチを送ってくれと頼まれたのですが、Sabroが使っているのはMonorail-RC3に会わせた少し古いバージョンでTrunkとはかなりクラス構成が変わっています。一応Trunkのものを持ってきて動かそうと試みてみたのですが、別のエラーが出て動作するところまでいきませんでした。そこで、申し訳ないですがパッチは送らずに、ローカルでソースを修正して使うことにしました。作者さんすいません m(_ _)m

やっぱ、まだMonoは色々問題あるなぁ。まあ半年の努力が無駄にならなくてよかったよかった(・∀・)

Tags:   , , ,
Categories:   .NET
Actions:   Permalink | Comments (52) | Comment RSSRSS comment feed

MonoRailのViewEngine

Sunday, 30 March 2008 11:18 by sabro

Sabroは、MonoRailのViewEngineに、AspViewを使用していますが、実際には様々なタイプのViewEngineがあり、用途に合わせて使い分けることができます。

以下の表は、MonoRailのサイトからコピーしたものですが、それぞれのエンジンの特徴が簡単に比較できます。

Engine Language Compiled Helpers ViewComponents
WebForms Any .net language Yes Yes No
NVelocity Velocity No Yes Yes
Brail boo Yes Yes Yes
AspView
(from Contrib)
C# Yes Yes Yes
StringTemplate (from Contrib) String Template No Partially Yes

機能的には、NVelocityが使いやすそうだったのですが、これはインタプリタ型だったので、パフォーマンスが気になりました。そこで、コンパイル型のなかで比較をしたのですが、WebFormはMVCでないのでスルー、Brailは独自言語でViewを作成するのが、ちょっと気になったのでスルーして、AspViewに落ち着いたという感じです。

まあでもAspViewも、よく分かっているわけではないので、Viewについては、もうちょっと使用感を見てから正式に決めようかと考えています。

Tags:   ,
Categories:   .NET
Actions:   Permalink | Comments (152) | Comment RSSRSS comment feed