专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > ASP

Asp.net 面临接口可扩展框架之核心容器

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
Asp.net 面向接口可扩展框架之核心容器

新框架的容器部分终于调通了!容器实在太重要了,所有用了一个名词叫“核心容器”。

容器为什么那么重要呢?这个有必要好好说道说道。

1、首先我们说从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下)

      解读一下:类是个体的定义(建模), 个体的每一方面都可以是一个接口

      说白点,其一接口可以代表对象(类)一个方面,再说透点对象可能是多面手(继承多个接口),能在不同场景(作为不同接口的实例)下正常工作

      其二每个接口可以有不同实现,只要实现了这个接口,基本上就可以替换这个位置来正常工作

2、我觉得面向接口编程本质上还是面向对象编程,可是更抽象,更便于扩展和替换

     我们需要很多很多的对象来支持系统的功能需要和扩展需求,还需要每个位置上的对象方便“随时”替换,扩充

     那我们怎么来管理这个庞大的对象库呢,如何方便的编排以便管理?这里就要说到容器了,容器可以很好的胜任这个工作。

3、容器的作用

  我认为容器就是仓库,就是柜子,就是盒子,以便我们可以按自己喜欢的方式存放自己的对象,以便需要的时候能方便的找到他们

      好的容器还能维护对象的创建、生命周期、控制反转(IOC)、依赖注入(DI)、拦截方法执行(AOP)等


前面废话太多,老规矩先上例子

一、对象的创建和管理由容器负责

1、以下还是前面那篇上下文的例子,使用容器来简化后的代码

 以上代码是不是简单漂亮多了

 2、代码虽然简单了,功能一点都没有水分哦,看看以下执行结果截图

是不是结果上一篇的完全一样啊。

3、结果一样不算什么,改个配置(不改代码),看看结果

4、再改配置(还是不该代码)

这次生动了吧,一家人各有各的个性了,是不是很炫啊。

5、大家看看配置

明眼人一眼就能看出这个是Unity容器的配置;有人说,你不是不要依赖Unity容器吗?我发誓确实没有依赖Unity容器,但我也没说不用Unity啊。我只是要做一个框架,其他技术方案都可以集成进来,容器也是。

你熟悉Unity就用Unity,你熟悉Spring.net也可以放心使用,只要你封装一下并继承这个框架的容器接口,再注册进来就可以正常工作了

 

二、使用了Unity容器,但不依赖Unity容器

1、调用容器的地方没有依赖Unity

这个测试项目除了系统的几个引用,就只引用了这个主框架了

2、主框架没有引用Unity容器

没骗你们吧?真没依赖Unity,主框架甚至除了几个简单的系统引用,没有依赖(引用)任何第三方组件,但是这一点都不影响我使用大量第三方的库,因为这里是"面向接口可扩展框架"

是不是现在又对接口有了进一步的理解了,是不是“面向接口可扩展框架”这个名字有点名符其实味道了。

 

三、下面来解密他到底怎么运行的

1、看入口,看应用程序(这里是控制台程序)的引用

哈哈,是不是找到了,终于看到Unity引用了

但是不要被表象所迷惑,其实这里的主角是Fang.Unity,因为这个项目可以不直接引用Unity容器,Fang.Unity是对Unity容器的封装。

控制台程序对Unity相关dll是运行时依赖,并不是编译依赖,这里直接引用上是为了便于调试

2、继续探究原理

Fang.Unity总不会是自动运行的吧?当然不是,上代码

上图有一句不起眼,但是非常重要的一行代码“Fang.Unity.ContainerFactory.Init()”,他就是“罪魁祸首”了

换句话话说,Unity容器是完全作为插件在本框架中运行的,如果我不调用Unity的Init,调用Spring.net的Init,那当前所有地方调用的就都是Spring.net容器了。

有人说这也太不方便了吧,当然不是每次使用容器都要调用,如果是web项目可以在global的Application_Start中调用一下就Ok了,也可以在HttpModule的Init中调用也可以。

大部分时候我们在开发中大量使用容器,但并不用想我具体用什么容器。

换句话说,我熟悉Unity容器,我使用Unity容器配置调试通过的组件给你使用,但是你一直都用Spring.net(或者其他容器),你调用Spring.net容器的封装,把配置修改为Spring.net的配置,代码一样能正常运行

注:前提是组件开发的时候使用的是框架的容器支持,没有直接引用Unity容器和直接调用Unity容器的代码

3、还是看一眼Fang.Unity.ContainerFactory.Init是什么鬼吧(哈哈,要不睡不着了)

Unity容器就不在这里展开,我会单开一篇讲Unity容器和Unity封装等

 

四、核心容器解析

1、容器相关实现类截图

2、核心类图如下:

稍作解析各个类的分工:

     A:IContainer接口是定义容器需要的基本功能

     B:IContainerFactory定义容器工厂接口

     C:GlobalContainer是个静态配置类,提供注册外部容器组件功能及提供调用容器的Api

这个是实现容器插件化的关键,这个实现是参考了Asp.net Mvc的DependencyResolver

   D:SimpleContainer提供一个简单和默认的容器和容器工厂实现

  AppContext中的上线文容器就是他实现的,如果不配置扩展容器功能,使用的容器就是他了,但是他其实就是一个字典缓存,存个东西,取个东西,完全没有问题,复杂配置及DI等就没戏了

   E:ContainerWrapper是个容器封装拦截类,拦截容器的操作,以便增加特性和功能

       这个以后再展开讲,里面有一个很有意思的特性

   F:ContainerFactoryCacheWrapper是容器工厂封装及缓存

       也就是外面实现的容器工厂是不用考虑单例模式缓存什么的,他给包办了,而且把每个生产好的容器对象检查和打包好

 

五、多容器的应用

1、我们需要多个容器来编排众多对象

就好比我从超市一次性买回来很多东西,有鸡蛋、排骨、蔬菜、儿童玩具、衣服等等。我不能弄一个大箱子全部放进去,也不乱放,不能把衣服和排骨一起放冰箱(会被媳妇骂死的)。排骨进冰箱冷冻室,鸡蛋和蔬菜进冰箱冷藏室。儿童玩具放儿童床。衣服放衣柜。

代码做了微调,再看运行结果

 有人说,你怎么越改越复杂啊,代码复杂一点点,但是配置更加有条理有点时候是值得的,看配置

这只是一个简单拆分容器的方案,也可以按对象图谱来划分容器,这样更加合理,因为对象之间有相互的依赖关系,使用容器来做控制反转也就是这个意思

如果是支持子容器的容器工具(Unity就支持),一个系统就可以按树状划分容器,整个系统的公共配置是根容器,每个子系统都有各自的容器配置,每个子系统的各个模块也有自己的容器配置,子容器可以继承父容器也可以覆盖父容器的配置

2、下面做一个树状子容器的例子

这个效果是不是杠杠的,代码也是漂亮的一塌糊涂,是怎么配置的,也看一下吧

总结一下,容器名是优美的链式语法,配置文件是树状管理结构,Perfect!!!

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ASP怎么隐藏表单

    ASP如何隐藏表单 <%if Cookies_Toy ="" then response.write "<a href='login.asp'>登录</a> <a href='reg.asp'>注册</a>" ...

  • 为何js调用css脚本后没效果

    为什么js调用css脚本后没效果 这个是css的脚本代码: body,ul,li{margin: 0; padding: 0; border: 0;} body {background: #f5f...

  • 怎么伪造post请求,求指点。

    如何伪造post请求,求指点。。。 要查询大批(也就几万个)运单的状态,那查询网站一次最多查24个,这一个个搞会搞死人的。。 有...

  • Asp.net_简略代码设置GridView自适应列宽不变形

    Asp.net_简单代码设置GridView自适应列宽不变形 动态绑定的GridView由于列数不固定,而列又太多(博主做的这个项目有150个左右的字段...

  • ASP.NET上实现AJAX注册提醒

    ASP.NET下实现AJAX注册提醒 Ajax全称是,主要是利用JavaScript实现异步的数据传输,首先说异步,异步是当前操作进行的时候,用...

  • aspnet_regiis装配出错:0x80070005 拒绝访问

    aspnet_regiis安装出错:0x80070005 拒绝访问 点击右边红色标题查看本文完整版:aspnet_regiis安装出错:0x80070005 拒绝访问安装...

  • 关于网站边框解决方法

    关于网站边框 像hao123这样的网站上的边框是着么弄的?背景图片吗?http://www.hao123.com 另外哪个素材网站有实用的这内素材 -----...

  • ! 多表分组查询统计

    求助!! 多表分组查询统计 高手们,帮帮忙! 用户表 D_user 为 ID Username GroupID 1 张三 2 2 李四 2 3 王五 ...

  • 在Paypal交付的同时,把表单的数据提交给数据库

    在Paypal提交的同时,把表单的数据提交给数据库 本帖最后由 liuyang2708 于 2012-11-20 23:14:54 编辑 在提交这个支付...

  • 虚拟目录上JavaScript不能正常执行

    虚拟目录下JavaScript不能正常执行 各位大侠好,我在同一台服务器上用两种方式部署同一个网站。 第一种方法:在IIS下直接建一个网站...

热门推荐: