SHOEISHA iD

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

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

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

3層データバインドを正しく活用しよう(前編)

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第1回

  • X ポスト
  • このエントリーをはてなブックマークに追加

3層データバインド

 ASP.NET Webフォームアプリケーションのデータバインドは、その実装方法により「2層データバインド」と「3層データバインド」に分類できます。

2層データバインドと3層データバインド

 2層データバインドとは、データバインドコントロールとSqlDataSourceコントロール、LinqDataSourceコントロール、EntityDataSourceコントロールなどの「コントロール自体が直接データアクセスを行うデータソースコントロール」を利用したデータバインドのことです。プレゼンテーション層とデータ層の2層でデータバインドを行うことから、そのように呼ばれます。

 構造がシンプルなためか、ASP.NET Webフォームアプリケーションの入門記事では2層データバインドを使ったものがよく紹介されているので、目にしたことがある方も多いのではないかと思います。

図1:2層データバインド
図1:2層データバインド

 これに対し3層データバインドは、データバインドコントロールとObjectDataSourceコントロール(プレゼンテーション層)、ObjectDataSourceコントロールから呼び出すロジック層(※注1)、データ層の3層でデータバインドを行い、プレゼンテーション層から直接データアクセスを行わないようにする方法です。

図2:3層データバインド
図2:3層データバインド
※注1

 ロジック層は、その内部でさらにビジネスロジックを実装するビジネスロジック層(BLL:Business Logic Layer)と、実際にデータアクセスを行うデータアクセス層(DAL:Data Access Layer)に分けるのが一般的です。後ほど改めて詳しく説明します。

2層データバインドの問題

 見た目はシンプルな2層データバインドですが、実際にアプリケーションを作成していく上では少し問題があります。

 以下のコード例で説明しましょう。これはTextBoxコントロールで入力した場所名を条件に、EntityDataSourceコントロールを使い、データを取得する例です。

[リスト1]2層データバインドの例:EntityDataSourceを使用した例
<asp:TextBox ID="LocationNameTextBox" runat="server"></asp:TextBox>
<asp:EntityDataSource ID="LocationsEntityDataSource" runat="server"
  ContextTypeName="DAL.MRRSEntities" EntitySetName="Locations"
  Where="it.LocationName like '%' + @LocationName + '%'"> <%-- (1) --%>
  <WhereParameters>
    <asp:ControlParameter ControlID="LocationNameTextBox"
      Name="LocationName" PropertyName="Text" Type="String"
      DefaultValue="%" /> <%-- (2) --%>
  </WhereParameters>
</asp:EntityDataSource>

 このコードの何が問題かというと、ビューにビジネスロジックが埋め込まれていることが問題になります。具体的には次の通りです。

  1. ビューにEntity SQLが直接記載されている
  2. 検索条件を指定しなかった時の扱いがビューに直接記載されている

 例で用いたEntityDataSourceコントロールを始め、2層データバインドに用いるデータソースコントロールを使用する場合、検索条件や抽出項目などをaspxファイルに直接記述する必要があります。そのため、本来データの入力、表示を行うためのビューであるaspxファイルに、ビジネスロジックが入り込んでしまうのです。

 このような構造にすると、ビジネスロジックを変更するには、必ずビューを変更する必要が生じてしまい、保守性に難があります。そして、データアクセステクノロジを変更したくても、ビューが従来のデータアクセステクノロジに固定されてしまうため、簡単には変更できません。

 また、ビジネスロジックをテストするには必ずアプリケーションを動作させなければならず、コードによる自動化テストの恩恵を受けることができません。

 その他にも、記述したEntity SQLはコンパイラによる構文チェックは行われません。これも開発効率低下の一因となります。たったこれだけのコードですが、2層データバインドでは多くの問題を抱えていることが分かったのではないかと思います。

3層データバインドを用いるべき理由

 2層データバインドはこういった問題があるため、実際にアプリケーションを開発する際には、3層データバインドを主に使用することをお勧めします。3層データバインドを用いることで、問題は以下のように解決されます。

ビジネスロジックがビューから分離される

 ビジネスロジックは専用のクラスに切り出すことになり、ビューには表示に関する情報のみが残ります。

 また、切り出したクラスはコードによる自動化テストを行うことも可能であるため、構造は複雑になりますが開発効率の向上が見込めます。

ビジネスロジックのコンパイルチェックが行える

 当然ビジネスロジックを切り出したクラスはコンパイラによる構文チェックが行われるため、コーディングミスにいち早く気付くことができます。

 ただ、ビジネスロジックの中でもEntity SQLを使えば同じようにコンパイラがチェックできませんので、Linq to Entityなどのコンパイル可能なテクノロジーを使えるなら、なるべくそちらを使うようにしましょう。もちろん、パフォーマンスなどの問題があれば、SQLを直接記載するなどの方法をとる必要があるので、必ずコンパイル可能にしなければいけないというものではありません。

次のページ
3層データバインドの実装方法

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6384 2012/02/16 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング