在使用 Membership 的时候可以为同一种操作方法定义多种行为,而具体使用哪种行为只需要在 Web.Config 中定义即可。

这样可以极大的促进了系统的灵活性,可是 Membership 这种 Provider 服务是怎么设计的呢?查了一些资料,也查看了 .Framework 2.0 的反编译源码,最终还是在 MSDN 上的一篇英文资料中找到了答案。
设计这种模式,似乎并不是那么容易,需要设计许多类方可。

构建基于Provider的自定义服务
下面是一个基本Provider的自定义服务的示例,它公开了两个操作方法“RetrieveImage”和“SaveImage”。它有可以会使用不同的数据库,这样可以定义多种处理方法。只需要在 Web.Config 中进行配置,就可以让系统调用相应的行为来进行处理。

1、 首先构建一个 ImageProvider 它继承了 ProviderBase 类。

基于Provider的自定义服务public abstract class ImageProvider : ProviderBase
}

 

2、 我们先定义一个使用 SQL Server 的处理方法。

 

 1基于Provider的自定义服务[SqlClientPermission (SecurityAction.Demand, Unrestricted=true)]
 2基于Provider的自定义服务public class SqlImageProvider : ImageProvider
 3}


配置基于Provider的自定义服务

现在可以看看如何在 Web.Config 中配置它所需的节点。这里在 <System.Web> 节中添加了 <ImageService> 节,在属性 defaultProvider 中指定了它使用的默认 Provider 服务。

3. Web.Config 文件中配置 Image Service

 1基于Provider的自定义服务<configuration >
 2基于Provider的自定义服务   基于Provider的自定义服务
 3基于Provider的自定义服务  <connectionStrings>
 4基于Provider的自定义服务    <add name="ImageServiceConnectionString" connectionString="基于Provider的自定义服务" />
 5基于Provider的自定义服务  </connectionStrings>
 6基于Provider的自定义服务  <system.web>
 7基于Provider的自定义服务    <imageService defaultProvider="SqlImageProvider">
 8基于Provider的自定义服务      <providers>
 9基于Provider的自定义服务        <add name="SqlImageProvider" type="SqlImageProvider"
10基于Provider的自定义服务          connectionStringName="ImageServiceConnectionString"/>
11基于Provider的自定义服务      </providers>
12基于Provider的自定义服务    </imageService>
13基于Provider的自定义服务  </system.web>
14基于Provider的自定义服务</configuration>

 

结构节点<ImageServer> 现在系统是不可识别的,所有必需还要有一个相应的类用来描述 <ImageServer> 配置节。

4. <imageServer> 配置节的描述类

 1基于Provider的自定义服务using System;
 2基于Provider的自定义服务using System.Configuration;
 3基于Provider的自定义服务
 4基于Provider的自定义服务public class ImageServiceSection : ConfigurationSection
 5基于Provider的自定义服务{
 6基于Provider的自定义服务    [ConfigurationProperty("providers")]
 7基于Provider的自定义服务    public ProviderSettingsCollection Providers
 8基于Provider的自定义服务    {
 9基于Provider的自定义服务        get { return (ProviderSettingsCollection) base["providers"]; }
10基于Provider的自定义服务    }
11基于Provider的自定义服务
12基于Provider的自定义服务    [StringValidator(MinLength = 1)]
13基于Provider的自定义服务    [ConfigurationProperty("defaultProvider",
14基于Provider的自定义服务        DefaultValue = "SqlImageProvider")]
15基于Provider的自定义服务    public string DefaultProvider
16基于Provider的自定义服务    {
17基于Provider的自定义服务        get { return (string) base["defaultProvider"]; }
18基于Provider的自定义服务        set { base["defaultProvider"] = value; }
19基于Provider的自定义服务    }
20基于Provider的自定义服务}
21基于Provider的自定义服务
22基于Provider的自定义服务

这一下可以在 Web.Config 中注册 <imageService> 节了,并且它会被系统识别。

5. 创建 <imageService> 这个配置节的处理类

 

 1基于Provider的自定义服务<configuration >
 2基于Provider的自定义服务  <configSections>
 3基于Provider的自定义服务    <sectionGroup name="system.web">
 4基于Provider的自定义服务      <section name="imageService"
 5基于Provider的自定义服务        type="ImageServiceSection, CustomSections"
 6基于Provider的自定义服务        allowDefinition="MachineToApplication"
 7基于Provider的自定义服务        restartOnExternalChanges="true" />
 8基于Provider的自定义服务    </sectionGroup>
 9基于Provider的自定义服务  </configSections>
10基于Provider的自定义服务  <connectionStrings>
11基于Provider的自定义服务    <add name="ImageServiceConnectionString" connectionString="基于Provider的自定义服务" />
12基于Provider的自定义服务  </connectionStrings>
13基于Provider的自定义服务  <system.web>
14基于Provider的自定义服务    <imageService defaultProvider="SqlImageProvider">
15基于Provider的自定义服务      <providers>
16基于Provider的自定义服务        <add name="SqlImageProvider" type="SqlImageProvider"
17基于Provider的自定义服务          connectionStringName="ImageServiceConnectionString"/>
18基于Provider的自定义服务      </providers>
19基于Provider的自定义服务    </imageService>
20基于Provider的自定义服务  </system.web>
21基于Provider的自定义服务</configuration>
22基于Provider的自定义服务
23基于Provider的自定义服务

现在可以加载并初始化自定义的 Providers
上面的事情都完成后,就可以实现这个 ImageService 了,它将根据 Web.Config 加载配置中默认的ImageProvider ,可以在 ImageService 类中直接使用它。

6、创建 ImageService 类,它将使用配置中的实例来处理

 

 1基于Provider的自定义服务using System;
 2基于Provider的自定义服务using System.Drawing;
 3基于Provider的自定义服务using System.Configuration;
 4基于Provider的自定义服务using System.Configuration.Provider;
 5基于Provider的自定义服务using System.Web.Configuration;
 6基于Provider的自定义服务using System.Web;
 7基于Provider的自定义服务
 8基于Provider的自定义服务public class ImageService
 9

这些在 Asp.NET 2.0 中被支持。

相关文章:

  • 2021-10-10
  • 2022-12-23
  • 2022-01-12
  • 2022-12-23
  • 2022-01-17
  • 2022-12-23
  • 2022-12-23
  • 2021-09-13
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-29
相关资源
相似解决方案