Dropthings研究(三):打造高性能的网站应用

前段时间写了关于Dropthings里面用到的两个框架,其一是Munq一款IoC框架,面向接口编程,其实这种技术多用于C/S的应用中;其二是AspectF面向切面编程,也是对OO编程的一个补充,使一些通用的但与特定的类无关的逻辑提取出来,用的时候向其中注册方法。

  • 高性能研究

 

 作为设计模式之一的单例模式,相信大家一定不陌生,在这里它就能派上用场了,先来看下整体的架构

Ioc的设计原理就是程序加载的时候把类对象放在一个集合中,等你取得时候按key来取值就行了,不用管相应类的具体实现。

在这里使用Service类来包裹Container的一些方法并且含有一个container的静态对象,看过我《C#的值类型和引用类型及方法调用的相关思考》这篇博文的人一定清楚,静态的对象是存在于类型对象中的,而且整个Appdomain的托管堆中只会存在这一个。

Container有一个registations集合,key是类的Type,value是register的对象,由于静态字段的引用,整个Appdomain的托管堆中也只会存在这一个。

Register类中有一个instance实例对象,它的构造函数需传入一个Func委托,为什么要传入委托呢?稍后再说。Func委托引用构造实例的方法。

 

延迟加载

如前所述,Ioc在应用程序加载的时候把对象和Type塞到集合中,留以后的程序取用。

但一开始就新建那么多类的对象塞入集合,未免有些太“未雨绸缪”的感觉,可以到我真正需要的时候再实例化。

看到Register类传入一个委托,委托引用的方法就是实例化方法,这样在程序加载的时候就不用一下把类全new出来塞到集合里了,而是等到真正需要的时候再新建它。

光是这样还不够,新建了这个对象之后,下次再来取用是不是还要再实例化呢,当然要把它放在register对象包含的实例对象instance中,等第二次取用的时候判断下不为空就直接取用。

这样只有第一次会需要加载,以后都是直接取用就OK了。这样整个托管堆中不会充斥着那么多的实例对象,不会频繁的触发垃圾回收了。

 

适用情况

当然单例模式存在它的适用范围,这个网站是使用在DAL层和BLL层,这是合理的,因为它们基本上都是与状态无关的,即类型中的方法不会改变类型的对象的实例字段(多数是因为类没有实例字段)。

肯定有人会问,与其使用这样的方式不如直接用静态方法算了?

与状态无关的方法多数是静态方法,因为它们与类型的对象无关,不会也不能操作实例字段。如果一味的使用静态方法就失去了面向对象编程的诸多特性,当然也不能面向接口了。

 

其他

这里的Container实现了IDisposable接口,因为container是一个静态的对象,除非等到Appdomain卸载的时候它才能被回收。

Dispose方法把container中的registations中的每一项的instance给Dispose掉,再把instance指向null。

在《Dropthings研究(一):Munq一款轻量级IoC框架》中ContainerLifetime类的Getinstance方法,给实例字段instance赋值,这里没有加锁,而这里是可能发生多线程的访问的,可能会造成多次实例化对象并把它赋给instance。

所以在我的方法里,我给它加了个双重验证锁。

本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值