nbsp; public abstract string[] GetRolesForUser(string username);
public abstract string[] GetUsersInRole(string roleName);
public abstract bool IsUserInRole(string username, string roleName);
public abstract void RemoveUsersFromRoles(string[] usernames, string[] roleNames);
public abstract bool RoleExists(string roleName);
// Properties
public abstract string ApplicationName { get; set; }
}
在RoleProvider抽象类中,没有具体的实现,均为抽象方法,此时的抽象类其实已与接口无异(注:事实上,在WebLogic中,在对角色管理的API中,就将RoleProvider定义为接口)。为了便于理解这里的设计思想,我们对RoleProvider类进行简化,仅关注该类的CreateRole()抽象方法。
实现RoleProvider抽象类的类型比较多,例如AuthorizationStoreRoleProvider、SqlRoleProvider、WindowsTokenRoleProvider等等。因此,最后的实现类图应该如下:

子类均重写了父类RoleProvider的抽象方法,例如SqlRoleProvider: public class SqlRoleProvider:RoleProvider
{
public override void CreateRole(string roleName)
{
//实现略;
}
}
在ASP.NET中会用到RoleProvider,通常是在web.config配置文件对其进行配置,例如在RoleManager节中配置RoleProvider:
<roleManager defaultProvider="SqlProvider" enabled="true">
<providers>
<add name="SqlProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlServices"
applicationName="PatternsSample" />
</providers>
</roleManager>
在配置文件中,.Net内部的处理时,要求providers的类型必须是RoleProvider类型,然后通过设置type的值,使其与具体的RoleProvider进行绑定。这里的处置方式显然利用了Dependency Injection(依赖注入)技术,利用反射技术将SqlRoleProvider对象sqlProvider注入,这样就避免了对SqlRoleProvider具体对象的创建,解除了调用者与它之间的偶合。当然在配置文件中,RoleProvider还需与Membership配合使用,但这不是这里所要关注的重点,因此不再详细讲解。
与RoleProvider相同的设计方式,在.Net Framework中,MemberShipProvider同样利用了Strategy模式,如下图所示的设计结构:

常用的是