SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

ASP.NETのセッションをタイプセーフに取り扱うクラスの作成

セッション、クッキー、クエリ文字列などのタイプセーフな利用

ダウンロード ソースコード (5.2 KB)

クラスの作成

1.Getメソッドの作成

 このクラスのポイントはHttpContextクラスのCurrentプロパティを利用することです。このプロパティを使用すると現在実行されているリクエストにおけるHttpContextクラスのインスタンスを取得できます。このプロパティ経由でSessionStateQueryStringにアクセスします。

 毎回、HttpContext.Current.Sessionと記述するのは煩わしいので、SValueクラスにstaticなGetメソッドを定義しておきます。これで、SValue.Get("CD")でソースコードのどこからでもセッションから値を取得できるようになりました。

 「aspx.cs」ファイルの中ではSession["CD"]でも値を取得できますが、「App_Code」フォルダのファイルの中ではSession["CD"]で値を取得することはできません。これは「aspx.cs」ファイルに記述されているクラスがPageクラスの派生クラスだからです。「aspx.cs」ファイルではSeeion["CD"]という記述により、継承元のPageクラスのSessionというプロパティ経由でSessionの値にアクセスすることが可能です。

 「App_Code」フォルダではページクラスの派生クラスの内部ではないのでそういうわけにもいきません。ですので、HttpContext.Current経由でアクセスするように記述することで、ソースコードのどの部分であっても同じ書き方で値を取得できるようになります。

 このように記述することで「aspx.cs」に記述したセッションから値を取得するコードを「App_Code」に移動することになってもコードを変更する必要がなくなり、コードの再利用がしやすくなるでしょう。

2.IDクラスの作成

 IDの記述ミスの可能性を削減するためにアプリケーションで使用するIDの一覧を表現するクラスを作成しておきます。クラスを定義する際にインナークラスとして定義しておけば、他のQValueやCValueでも名前の衝突を避けることができます。

 このIDクラスを使用して、SValue.Get(SValue.ID.Count)というようにインテリセンスの力を借りながらコードを記述すれば、打ち間違いによるバグの混入を避けることが可能になり、堅牢性の向上が期待できます。

3.タイプセーフなプロパティの作成

 最後にタイプセーフなプロパティを作成します。

 ここでは私が作成したCastクラスを使用して型変換しています。.NET Framework 2.0では、値型の各クラスにTryParseメソッドが実装されています。これを利用することで型変換を.NET Framework 1.1のときよりも簡単に実現することができます。

 Castクラスはこの型変換をさらに簡単に行うためのメソッドをまとめて定義したクラスです。詳細はサンプルのソースコードをご覧ください。

 このようなプロパティをSValueクラスに定義することで、利用側はSValue.Count(Int32型)というように簡潔に値を取得できます。

 インテリセンスを利用すれば定義されているキーが一覧で見れるので、わざわざ仕様書などでキーを確認する手間を省くことができ、効率のアップとバグの発生確率の低減が期待できます。

 またタイプセーフであるということはもうひとつのメリットがあります。例えばキーがItemCDからItemIDに変更になったときに、SValueクラスのプロパティを変更してコンパイルすると、SValue.ItemCDと記述してある部分がすべてコンパイルエラーとなってリストアップされます。リストアップされた部分を全て修正すれば、修正漏れすることなくアプリケーションの修正を完了させることができます。Session["ItemCD"]と記述していると文字列検索で修正対象の箇所をリストアップする必要があり、より多くの手間と検索漏れが発生する可能性が高まります。タイプセーフであることにより変更に対する保守性が大幅に向上します。

まとめ

 同様のクラス設計でクエリ文字列やクッキーの値を出し入れするクラスを作成できます。これらのオブジェクトへの値の入出力はアプリケーションの全体に渡って行われるので、この部分のコードを簡潔に記述できるような仕組みを導入することで再利用性・堅牢性・保守性の向上、ひいてはアプリケーション全体の品質の向上につながるでしょう。

 この記事が皆さんの参考になれば幸いです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

Higty(Higty)

C#マスターになるべく勉強中の身分です。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1048 2007/09/30 09:37

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー