1

カスタムWebコントロールにプロバイダーパターンを実装しようとしています。私はまだパターンを理解しようとしていますが、次の質問があります。

デフォルトのプロバイダーは、コントロールがロードされたときに常に使用されるプロバイダーですか?私が知る限り、使用されるプロバイダーは常にデフォルトになりますが、MSDNのドキュメントには、プロバイダーの選択を許可するサーバーコントロールには、defaultProviderの値にデフォルト設定されるProviderプロパティが必要であると記載されているためわかりません。私にとっては、そのプロバイダーがConfigファイルにある限り、コントロールはそのProviderプロパティに基づいて特定のプロバイダーをロードできることを意味します。あれは正しいですか?したがって、特定のプロバイダーが要求されていない場合は、デフォルトのプロバイダーが返されます。

プロバイダーを変更するには、構成ファイルのdefaultproviderを変更するだけですか?<-返されるdefaultProviderを変更するだけなので、これは正しくないと思います。

これは正しいですか:コントロールでは、defaultproviderがコントロールのOnLoadイベントメソッドにロードされますか?プロバイダーに応じてさまざまなソースから制御データを渡す必要がありますが、結果のデータはクラスに入れられます。コントロールがそれ自体をレンダリングするために使用するもの。

ページからコントロールにデータを取得する方法も混乱していますか?私のProviderBaseにLoadDataというメソッドがあったとしましょう

次に、SQLCustomerProviderでLoadDataメソッドを実装します。ここでこのコードをカスタマイズして、特定のデータを読み取り、クラスにロードするのは問題ありませんか、それともコントロールを使用するページでデータをクラスにロードする必要がありますか?

ありがとう!

4

1 に答える 1

1

プロバイダーに関する私の知識は、メンバーシップ/プロファイル/ロールの作成に限定されていることを前もって認めますが、一般的なものは引き続き適用されるはずです。

開発者に別のプロバイダーを指定する機会を与えない限り、はい、デフォルトのプロバイダーが使用されることになります。

したがって、認証を例にとると、web.config に次のものが含まれているとします。

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
  <providers>
    <remove name="AspNetSqlProvider" />
    <add name="SqlProvider"
      type="System.Web.Security.SqlMembershipProvider"
      connectionStringName="SqlServices"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="true"
      passwordFormat="Hashed"
      applicationName="/" />
    <add name="AdProvider"
      type="System.Web.Security.ActiveDirectoryMembershipProvider" />
  </providers>
</membership>

ページのどこかに Login コントロールを追加すると、SqlProvider が使用されます。

次の 2 つの方法のいずれかで別のプロバイダーを使用できます。

  1. Login コントロールのMembershipProviderプロパティを使用して、別のプロバイダーを指定できます。
  2. ログイン コントロールのAuthenticateイベントで呼び出されるメソッドを提供できます。このイベントでは、プロバイダーを選択できます。

方法 2 の例は次のとおりです。

private void OnAuthenticate(object sender, AuthenticateEventArgs e){
  bool authenticated = false;

  MembershipProvider sqlProvider = Membership.Providers["SqlProvider"];

  authenticated = sqlProvider.ValidateUser(Login1.UserName, Login1.Password);

  if (!authenticated){
    // User not found in database, try Active Directory:
    MembershipProvider adProvider = Membership.Providers["AdProvider"];
    authenticated = adProvider.ValidateUser(Login1.UserName, Login1.Password);
  }

  e.Authenticated = authenticated;
}

独自のコントロールでこれを行う他の方法は、Provider プロパティを公開し、値があるかどうかを確認し、defaultProvider の代わりにそのプロバイダーを使用することです。

一般に、プロバイダー モデルは、既知のクラスに既定の一連の動作を提供するために使用されてきました。そのため、すべてのメンバーシップ プロバイダーには、(たとえば) MembershipUserを返すメソッドGetUserがあります。AspNetSqlMembershipProvider の GetUser の実装の全体的な目的は、ロードすることです。 ASP.NET SQL データベースからの MembershipUser データ - これは、サンプル メンバーシップ プロバイダーで動作を確認できます。

それが役立つことを願っています!

于 2009-07-28T20:57:07.080 に答える