提供者模式& DefaultProvider

时间:2009-02-26 16:05:54

标签: asp.net design-patterns provider

我正在尝试在自定义Web控件中实现提供程序模式。我仍在尝试理解模式,我有以下问题。

默认提供程序是我的控件加载时总是要使用的提供程序吗?从我可以告诉我使用的提供程序将始终是默认值,但我不确定,因为MSDN文档说,允许选择提供程序的服务器控件应该具有默认值为defaultProvider的Provider属性。对我而言,这意味着只要该提供程序位于Config文件中,控件就可以基于它的Provider属性加载给定的提供程序。那是对的吗?因此,如果未请求特定提供程序,则返回默认提供程序。

要更改提供程序,我只需更改配置文件中的defaultprovider吗? < - 我认为这是不正确的,因为这只会改变返回的defaultProvider。

这是正确的:在控件中,默认提供程序将加载到控件的OnLoad事件方法中吗? 我需要根据提供者传递来自不同来源的控制数据,但结果数据将被放入一个类中。控件将用于渲染自身。

我也很困惑如何从页面获取数据到控件? 假设我的ProviderBase有一个名为LoadData的方法

然后在我的SQLCustomerProvider中我将实现LoadData方法,可以在这里自定义此代码以读取我的特定数据并加载到类中,或者使用控件的页面是否应该将数据加载到类中?

谢谢!

1 个答案:

答案 0 :(得分: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。

您可以通过以下两种方式之一使用其他提供商:

  1. 您可以使用Login控件的MembershipProvider属性指定其他提供程序
  2. 您可以在登录控件Authenticate事件中提供一个方法,您可以在此处选择提供商。
  3. 方法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。

    通常,提供者模型已用于为已知类提供一组默认行为 - 因此成员资格提供程序都具有(例如)返回GetUser的方法MembershipUser - AspNetSqlMembershipProvider的GetUser实现的全部目的是从ASP.NET SQL数据库加载MembershipUser数据 - 您可以在Sample Membership Provider

    中看到这一点。

    我希望有所帮助!