日記
VB.NET覚え書きEdit

前の地獄仕事の後をいまだに引きずったりしているせいで、新しい仕事の方になかなか集中できない。新しい仕事の方も、スケジュール的には結構きつい(し、技術的難易度はかなり高い)のに。せっかく地獄を抜け出したのに、のんびりweb日記を書くモードになかなか入れないんで、しょうがないから仕事の覚え書きを日記代わりに書いておこう。

というわけで、VB.NET(あるいは.NETのWebアプリケーションフレームワーク)に関する覚え書き。

  • Pageのグローバル変数(プロパティ)は、PostBackで破棄されてしまう(いかにもPage単位でグローバルに見えるのに)。PostBackでPageのグローバル変数を保存したい場合は、INPUTタグ相当に変換されるコントロールにセットしておくか、あるいはSession、Application、ViewStateなどに明示的に保存しておく。ただし、ViewStateにはオブジェクト(あるいは暗黙のうちにシリアライズされないオブジェクト)は保存できない。
  • Application(やSession)にオブジェクトを保存した場合、それを取り出す際には明示的にCTypeで型変換を行う必要がある。CTypeしなくてもきちんと取り出せる場合があるが、保証はない。明示的にCTypeすれば確実に取り出せるらしい。
  • 結局Page単位でグローバルなオブジェクトを保存する仕組みはないらしい。アプリケーション単位(Application、Cache)か、ブラウザセッション(Session)単位で保存しつつ、生存時間を開発者がコントロールするしかない。ただし、オブジェクト変数じゃないのならばViewStateに入れることで、比較的気軽にPage単位の生存時間を利用することが可能。
  • といいつつも、オブジェクトをPage単位の生存時間で扱う方法として、ユーザーコントロールのSessionを利用するやり方が使えるかも。と思いついたけれども試していない。もしそれで実現できたとしても、面倒くさいから常用したくないな。
  • Pageのグローバル変数は、Server.TransferでほかのPageに移動する際ならばPage間で引き継ぐことができる。Context.Handlerを遷移元ページのクラス名で型変換かけることで、前のページのPublicなPropertyが見える。でも、同ページ内でのPostBackでは同様の処理はできなかった。
  • そういえば、.NETのオブジェクトはリファレンスカウンターを持たず、適当にガベージコレクトされて破棄されるようなことが書いてあったが、ApplicationやSesionに保存されたオブジェクトが破棄されるタイミングはどうなるんだろう? ApplicationやSessionに保存したオブジェクトも、暗黙のうちに破棄される可能性を意識してプログラムを組む必要があるのか? だとしたらApplicationとCacheの違いは、単に生存確率の差だけ?
  • Page単位のCacheの仕組みのサンプルとして、10秒とか30秒とか適当な時間単位でCacheを有効にするよう設定されていたが、その時間に根拠はあるのだろうか? まじめにDirtyコントロールするのはかなり大変そうだから、トライアンドエラーで適当に時間設定しろってことなのか?
  • 汎用のCacheクラスを使ったキャッシュの方は、ファイルの更新をキーにCacheに更新をかけさせるような仕組みを持っていたが、ファイルではなくDBの状態をキーにできないんだろうか? DB側にTriggerを作っておいて、それをキーにCacheクラスにUpdateがかかれば便利そうなのに。
  • アプリケーション内でのconstは、ユーザーコントロール(ascx)に入れるのと、従来のようにglobal.asaxに入れるのとではどちらがいいんだろう?
  • そういえば、Pageのグローバル部でnewしたオブジェクトは、各イベントハンドラ内で見えたり見えなかったりしている気配。PageのOnLoadでnewした場合は、どこからでも見えるみたいだけど。いったいPageのグローバル部のスコープはどうなっているんだ?
  • 同様に、global.asax内のグローバルな変数たちも、どのイベントハンドラ内で生成してからApplicationなりSessionなりに入れるかで、Page側からの見え方が違うっぽい。少なくともオブジェクト内で直接Sessionをみたい場合は、Session_OnStartとかで生成しないとダメ。
  • といいつつも、たいていの場所から見えるHttpContext.Currentを使えば、webアプリケーションの現在のhttpセッション(=Page)が簡単に扱えるので、上記のようなことは実際には気にする必要がなかった。HttpContext.Current.ResponseとかHttpContext.Current.Sessionとかがたいていの場所で使える。
  • <%# …… %>を使ってデータをBindする表記法を使うと、VisualStudio.NETのデザイナ画面がすぐに腐る(開けなくなる)な。少なくともaspxのhtml画面側で<%# …… %>部を追加するとすぐダメになるっぽい。新規追加時には各コントロールのtext部に書いて追加すれば、腐りにくい気配(でも修正はhtml画面でやらないとダメ)。
  • 結局普通に(旧RecordSetっぽく)DataSetを使う場合は、DataSet.Tables(0).DefaultView(RowIndex)(field_name)とやるのが基本なのか? DataGridとかDataListとかにDataBindするだけだったら、DataSource=DataSetすればいいだけなんだろうけど。

ほかにもいろいろあった気がするけど、思い出すのに疲れたから今日のところはここまで。

Published At2002-04-22 00:00Updated At2002-04-22 00:00