体验.net2.0的优雅(4) Provider、策略、控制反转和依赖注入2011-02-06 博客园 quitgame在 ASP.net 2.0 的配置文件中,经常看到 Provider的影子,比如说StarterKit 中的XmlSiteMapProvider以及使用Login Controls时隐含的SqlMembershipProvider。如此众多的Provider,我猜测它们肯定有共同的父亲!查阅了一下资料,果然不出我所料,它们的父亲是 ProviderBase。

[图中的 三个点 代表直接父类的名称]我们以Membership为例,来看一下这么多的Provider是怎么被系统所使用的,以及使用它们会给我们带来什么样的好处。

LoginControls(包括登录、创建用户、修改密码等控件)是服务器控件,这些服务器控件通过MembershipAPI 来执行相应的操作。MembershipAPI是密封类(System.Web.Security.Membership类),其中定义了很多静态的方法,包括 CreateUser、DeleteUser等等,但是本身并不提供具体的实现,而是使用MembershipProvider提供的服务。MembershipProvider是一个抽象类,其中也定义了CreateUser、DeleteUser 等方法,SqlMembershipProvider是它的一个实现,可以将Membership的数据持久化到Sql Server 2005中。1.Strategy这里用到了一个非典型的策略模式(strategy)。在典型的策略模式中,Provider应该是通过构造方法注入,而在此处,Membership是一个静态类,它的Provider和ProviderCollection都是只读属性,因此我猜测Provider并非是由其他类注入的,而是由Provider自己通过应用上下文获取到的。策略模式的作用是将 MembershipAPI 对具体的Provider(比如SqlMembershipProvider)的依赖转化成了 对抽象类 MembershipProvider 的依赖 + SqlMembershipProvider对MembershipProvider的依赖,从而符合开闭原则(OCP)。这样可以保证系统的灵活性和效率。