体验.net2.0的优雅(4):Provider、策略、控制反转和依赖注入
[图中的 三个点 代表直接父类的名称]
我们以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)。这样可以保证系统的灵活性和效率。
2. IoC
这里应用的策略模式的一个附带的好处是实现了 控制反转(IoC)。通常我们设计分层应用的时候,都是自底层向上层设计,上层的组件使用下层提供的服务并直接依赖于下一层的组件。这样做的缺点是 造成底层组件很难修改,因为任意的修改(比如修改方法的功能或者名称)都可能导致上层应用崩溃。使用了策略模式模式以后,我们把MembershipAPI和MembershipProvider抽象类置于同一层(上层)中,底层的SqlMembershipProvider则依赖于上一层(实现MembershipProvider中的抽象方法)。很明显,我们将上层组件对下层组件的依赖转化成了下层组件对于上层组件的依赖,这就是控制反转。好处是给我们带来了即插即用功能---Provider是可插接的,由于Provider造成的一切系统崩溃都由 Provider 自己负责。
3. Dependency Injection
我们可以实现自己的MembershipProvider,比如说OracleMembershipProvider---使用Oracle来存储Membership和Profile数据---只要我们继承MembershipProvider类并覆写的部分方法即可。那么我们编写的 OracleMembershipProvider 或者 系统自带的 SqlMembershipProvider是如何被 MembershipAPI 使用的呢?这里有一个重要的概念---依赖注入(Dependency Injection)。依赖注入的意思是将应用程序依赖的组件在运行时注入给应用,依赖注入一般要使用反射技术。
依赖注入通常分为3种形式:
构造注入:通过构造方法将组件注入
设值注入:通过设置属性的值将组件注入
接口注入:从容器中获取指定接口的实现
注入过程一般由某种 IoC 容器(比如Spring)完成,而且特别适合由容器完成。很难说在MembershipAPI 中使用了某种典型的依赖注入方式。我们可以这么说,仅仅使用了反射工厂。因为在这里,仅仅使用反射已经足够,不需要复杂的对象装配过程。
如果不考虑内部的实现过程,我们要做的,仅仅是将我们的实现拷贝到Bin目录,并在Web.Config文件中system.web节中增加下面的节点:
<providers>
<clear/>
<add name="OracleMembershipProvider" type="Oracle.OracleMembershipProvider"/>
</providers>
</Membership>
其中 type 中定义的就是 我们自定义的Provider的全名称(包括名字空间)。
转载于:https://www.cnblogs.com/QuitGame/archive/2006/01/16/318502.html
体验.net2.0的优雅(4):Provider、策略、控制反转和依赖注入相关推荐
- nstruts2.0发布前奏---浅谈struts和依赖注入在项目中的应用
我喜欢struts,喜欢ibatis,喜欢spring,但我却喜欢.net,这实在是件很矛盾的事情..net很好用,但在做项目的过程,总觉得缺少了点什么,对了,是框架.在java的世界里,有着许多成熟 ...
- 利用ASP.NET2.0向导控件一步步建立与用户的交互--------提高和自定义用户体验
本文是利用ASP.NET2.0向导控件一步步建立与用户的交互--------基本概念的后续文章,介绍了Wizard控件的高级使用以提高用户使用体验. 单击下面链接进行查看 http://www.cnm ...
- asp.net2.0如何加密数据库联接字符串
asp.net2.0如何加密数据库联接字符串 在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:/WINDOW ...
- ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...
- .net2.0中SqlBulkCopy批量复制数据出错原因分析!
在项目后台数据库选择SqlServer,进行批量复制数据时,.net2.0中提供的SqlBulkCopy不失为一个好的选择,性能相当可观;最近亲手实验一把,效果不错,大家可以参见http://www. ...
- 深入解读ADO.NET2.0的十大最新特性
篇文章概述了.NET Framework 2.0里的ADO.NET2.0的最新特性.在以下叙述中将附带一些简单的例子来讨论这些特性的细节.以下便是ADO.NET新增的特性: 1. 批量复制操作(Bul ...
- Castle Active Record for .NET2.0快速入门示例
一.创建Web工程 创建一个Web站点或者Web应用程序,添加对Castle.ActiveRecord.dll的引用. 二.创建需要持久化的业务实体 在.NET2.0下,由于引入了泛型,创建业务实体比 ...
- 数据访问函数库 for ado.net2.0
前言 源代码和调用演示下载:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html 数据访问函数库for ado.net 1.1 的说明 ...
- ADO.NET2.0的十大新特性
这篇文章概述了.NET Framework 2.0里的ADO.NET2.0的最新特性.在以下叙述中将附带一些简单的例子来讨论这些特性的细节. 以下便是ADO.NET新增的特性: 1. 批量复制操作(B ...
最新文章
- [Bash Shell] Shell学习笔记
- ffplay的快捷键以及选项
- java导出pdf 含图片_java 生成PDF含图片和中文件实现代码
- html特殊符号sm,以前搜集的一些资料—html中的特殊字符(2)
- `ll/sc` 指令在`linux`中的软件实现
- java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解
- 社交网络影响力最大化——贪心算法实现(Python实现)
- 横空出世 | Limelight宣布收购雅虎的Edgecast,打造全球边缘软件解决方案领导者Edgio
- win10安装AutoCAD2006步骤
- 网站的robots 文件写法 附自动生成工具网址
- 语句摘抄——第16周
- 【UE4】蓝图转为C++官方教程部分笔记
- 【转】WPF自定义控件与样式(13)-自定义窗体Window 自适应内容大小消息框MessageBox...
- 复旦大学计算机学院肖江,【学术报道】复旦大学肖江教授应邀来我校学术交流...
- 模型的偏差、方差分析
- jasper java_java – 结合两个Jasper报告
- dpi和ppi换算_ppi和dpi换算(1ppi等于多少dpi)
- 仿QQ空间图片放缩查看
- 上海喔趣科技有限公司面经 Java实习生(记录第一次面试)已oc
- CISCO 路由器 初始化必备安全命令
热门文章
- 架构师课程之-haproxy专业级负载均衡软件权威讲解
- 一款Octopress插件用于同步博客到其他站点
- [转]C#遍历局域网的几种方法及比较
- AIX下删除LV后的现场保护和数据恢复方案
- 未分配内存的指针导致段错误
- Oracle the network adapter could not establish the connection
- Linux有时会出现“You have new mail in /var/spool/mail/root”
- ExtJs 备忘录(6)—— GirdPanl表格(二) [ 搜索分页 ]
- redis配置主从复制
- 对手机图标整理事件总结