2009-03-24 16 views
1

C#.net 3.5 WebプロジェクトのWebページやユーザーコントロールに使用したい機能があります。ページに対する私の標準的なアプローチは、System.Web.UI.Pageクラスを拡張し、ページクラスから直接ではなく、これを継承する「基本ページ」を作成することです。ページ、Webサービス、Webコントロールの共通継承

私は、これらの機能の一部をWebコントロール(ascx)とWebサービスに公開したいと考えています。私はこれを行うためのいくつかの方法を考えることができますが、彼らは少し不器用なように見え、私はトリックを欠いていると思います。

継承を使用してページ、Webサービス、およびコントロールの両方に共通の機能を提供する簡単な方法はありますか?また、これらの機能をすべてアクセスできるクラスでラップする必要がありますか?

明確にする例:

  • 私は自分のWebアプリケーションのほとんどの機能を扱うシングルトンを持っています。
  • 各リクエストの開始時に、クラスがWebキャッシュに存在することを確認し、そうでない場合は初期化します。

最初は、このページがすべて使用されたページベースで処理されました。今では、同じチェックを使って、サービスとコントロールから安全に自分のシングルトンにアクセスできる必要があります。したがって、私はチェックと初期化のロジックを別のクラスに抽出して、それぞれのベースページ、コントロール、およびWebサービスをインスタンス化します。このモデルでも、同じコードを3つの場所(コントロール、ws、ページのそれぞれのベースクラス)で繰り返しますが、コードはそれほどありませんが、これも間違っています!

それは動作しますが、不器用に思われます...私はあなたの知恵で私を謙虚にお待ちしております!

+0

これはすべて参考になります。私が見る限り、これを解決することを知らなかった「一般的な」解決策はありません。入力いただきありがとうございます。 – Timbo

答えて

1

アスペクト指向プログラミングのようなものです。 .NETはこれに対応していません。私はあなたのソリューションが最高のものだと恐れています。

また、これらの関数のすべてまたは一部を静的クラス/シングルトンに移動し、そのクラスをaspx/ascx/asmxから使用できますか?継承の方法はあまりありませんが、少なくともコードの重複はありません。

1

私の解決策は、基本マスターページクラスに共有したいすべてのメソッドと関数を配置することです。これはと助けない何

//Property in masterpage base 
    public string QsSearchTerm 
    { 
     get 
     { 
      if (!String.IsNullOrEmpty(Request.QueryString["q"])) 
      { 
       return Helpers.SanitiseString(Server.UrlDecode(Request.QueryString["q"])); 
      } 
      return String.Empty; 
     } 
    } 

    //Property in usercontrol base 
    public string QsSearchTerm 
    { 
     get 
     { 
      if (Page.Master is BaseMasterPage) 
      { 
       return ((BaseMasterPage)Page.Master).QsSearchTerm; 
      } 
      return string.Empty; 
     } 
    } 

は、Webサービスの基本クラスを使用してコードの繰り返しで次のように私は、ユーザーコントロールの基本クラスの各メソッドおよび機能に相当するものを置きます。私は、上記のリファクタリングを、HttpContextインスタンスを受け入れるコンストラクタを持つクラスにリファクタリングすることが前進であると考えています。このクラスのシングルインスタンスを基本Webサービス、マスターページ、ユーザーコントロール、ページなどに公開することができます。

これがうまくいくと思っていますが、もっと良い方法があれば私も聞きたいと思うでしょう。

1

シングルトンでは、設定された環境に応じてさまざまなコードを使用できるように戦略インターフェースを提供することができます。これにより、web/windows/wcf ...などの間で切り替えることができます。

0

私はBasePageを使うのが正しいアプローチだと思います。

私は現在のページで使用されているベースページによって異なるロードとカスタムユーザーコントロールを持っています。いいえカスタムユーザーコントロールに反復コードの乗り心地を得ることができ

if (this.Page is BasePageName) 
{ 
    BasePageName bp = (BasePageName)this.Page; 
    bp.BasePageFunction(); 
} 

、ちょうどベースページからそれを呼び出す:カスタムユーザーコントロールあなたがのようなものを使用することができて

ページの機能とニーズに応じて、継承した基本ページの階層を設定することもできます。 basePageName2:BasePageName

関連する問題