.NET的轻量级IOC框架芮双随笔

面向对象的设计的重用性一直是他的一个重要特性,为了有效定义这一特性,又引申出面向对象设计的几个原则:高内聚、低耦合、功能单一、优先使用聚合、面向接口编程等。依赖这些原则和前人的经验,又发展出形形色色的模式,分析这些原则和模式可以发现,或许是因为硬件的快速升级,我们走的是一条牺牲软件效率以提高其重用性的道路。而沿着这条路走出的另一步就是现在出现在.NET中而Java已经有了相当发展的IOC框架(以上纯属个人观点)。目前.NET中的IOC框架较受关注的有Spring.net和Castle等。

 

    
IOC的中文直译是控制反转,这个概念有些大而空泛,于是有人提出了依赖注入(DI),并将其做成一种模式,所以也可以说,IOC框架是快速实现依赖注入模式的一种工具。依赖注入,顾名思义,类间的或者接口间的依赖关系并不是在编译时就明确建立的,而是通过某种手段,在运行时建立的,或者可以称为晚绑定、动态绑定。依赖注入又可分为3种方式:接口注入、设值注入、构造器注入。接口注入很多人在不经意的时候可能都使用过,就是在配置文件中确定对接口的调用实际上是用的是哪个具体类;设置注入针对的是类的属性,将这些属性的值在配置文件中注入;构造器注入针对的是包含参数的构造函数,将这些参数的值在配置文件中注入。很简单的原理,扩展开来,就成为下边要说到的框架。

 

    
Spring.net移植于java的spring框架,目前版本为预览版3,它基本可以算作spring框架的.NET实现版本。Spring.net是一种低侵入式的框架,它是由一系列松散的平行框架组成。Spring.Core 
core就是一个对象工厂(ObjectFactory), 
它通过配置中的对象定义来创建对象,它的目的是消除对象的new操作。在配置文件中,除了定义对象的一些属性外,还能定义对象之间的相互关系,这就使得对象之间的耦合延迟到了运行时,如果针对接口或抽象类进行编程,则还可以通过具体对象的不同实现来定制系统的行为。  Spring.AOP 
这是按AOP联盟的接口定义来实现的,AOP即面向截面编程,其核心是通过给对象创建一个动态代理对象来接管对象的操作,这样就能对操作进行前置和后置处理了。Spring.Data 
这是一个由第三方实现的整合到Spring内的数据访问组件,目前已包括了NHibernate的实现部分。Spring.NET还显得不够成熟,一些功能因为平台的局限性而导致了移植上的困难。其核心为IOC框架和AOP实现框架,所有这些可以组合起来共同工作,也可以根据需要选择其中一部分单独工作。相对于其他框架而言,Spring.net是从java移植而来,很多思想也是直接转嫁过来的,例如以配置文件为核心、MVC框架等,以配置文件为核心是一个争论的话题,各说各有理,支持的人认为这提供了强大的灵活性和透明性,反对的人认为这大大增加了配置文件的复杂性和错误的不确定性;MVC框架是个好东西,在使用它之前,很多.NET使用者也试图将表现层和控制层分离,并将控制层集中,只是一直没有找到好的解决方案,个人认为这与.NET的以事件为驱动的编程模型有些关系,这种模型使得控制层很难被分离成为单独一个有效的层。移植来的MVC框架解决了一部分的问题,但他依然有所限制,如果我们的表现层使用了一些第三方的控件,从而引入第三方的事件处理句柄和参数时,这些又会将模型、表现和控制层牢牢地结合在一起,使MVC框架失去了意义(这种理解方式为个人观点,但对第三方控件的依赖会使MVC框架失效这个结论是被认同的)。作为从java移植来的框架,Spring.net还有一个优势,就是Spring在java中有很多比较成熟稳定的与其他工具搭配使用的方式,而这些工具又有很多都有了.NET版本,这样对于熟悉java的人来说,上手就变得容易了很多,可以减少很多摸索的过程。

 

    
Spring.net是一种低侵入式的(它的有些子框架是无侵入式的,例如IOC框架)框架,被他管理的组件和服务不需要具备Spring.net的特征,因此只要这些组件的业务被合理设计,他们就可以在任何需要的地方使用,从而实现他们的重用性。这部分的功能是在IOC框架中完成的。反过来说,因为这种无侵入性,任何其他框架下的或者独立的组件都可以在Spring.net的IOC框架下被管理和使用,因此,Spring.net不但可以应用于新系统的开发,也同样适用于对旧有系统的整合。Spring.net的IOC框架支持上边提到的那三种依赖注入,但他比较推荐使用设值注入。如果所依赖的不是一个基本类型而是一个对象的话,框架支持自动查找装配,只要这个被依赖者也进行了配置,但这种做法并不被作者推荐,推荐的做法是手工在配置文件中建立关联关系。

 

    
Spring.net的AOP集成框架与其它的.NET 
AOP实现差不多,目前都还只能对具有Virtual修饰符的方法进行拦截,从而插入想要执行的代码。对于AOP,面向方面编程单从概念上讲比较难以理解,这方面比较典型的例子是记录日志。在一个系统中各种操作都需要记录日志,所以日志就是一个“方面”,传统的记录日志的方式一般是做一个公共的模块,由需要记录日志的组件来调用它,从设计上看,这需要建立起非常多的依赖关系,不符合低耦合的原则。而使用AOP则可以对这种情况进行解耦,它的做法是进行代码注入。将写好的记录日志的代码,使用配置文件“注入”到需要记录日志的方法中,注入的方式包括前置、后置和包围等。前置是将注入代码在方法前执行,后置是将注入代码在方法执行后执行,包围是在方法执行前执行一部分,然后再方法执行后再执行一部分,这种方式可以让我们联想到事务处理也是可以这样来做的!但是AOP也会带来一些问题,他降低了系统设计的可预见性,使得错误难以被发现且增加了新手上手的难度。

 

    
Castle的整体构建与Spring.net有很多相似,他同样是低侵入式的,由一系列可以独自运行的子框架组成。他目前使用的版本是Release 
Candidate 
2。作为一个开源项目,它比较强调扩展性,目前他还只具备比较基本的功能,例如在自动类型转换功能中,它仅有基本类型和继承了IList接口的转换,如果需要新的类型转换,就需要用户自己定义一个转换器才可以。Castle主要包括以下几个组成部分:MicroKernel、Windsor、MonoRail、Aspect#、ActiveRecord,其中MicroKernel是IOC框架的核心,也是整个Castle框架的核心,Windsor是对MicroKernel的扩展,是一个真正适合使用的IOC框架,MicroKernel/Windsor是Castle的底层核心实现,它采用IoC容器对系统进行运行期动态设置,主要包括Facilities、Components、Services三大部分。MonoRail是Castle的MVC框架,它是Ruby 
on Rail的.Net实现,这是一个MVC 
Web框架,它与传统WebForm在控制上的不同在于WebForm采用页控制器模式,而MVC采用前端控制器模式。在界面表达方式上MonoRail采用模板引擎输出,模板引擎在PHP和JSP上已广泛使用,而在ASP.NET上因为服务端控件的强大功能和易用性而很少有人使用,两者是各有优缺点。Aspect#是Castle的AOP框架。除了自身提供的功能外,它还提供插件式的扩展,例如Nhibernate就被作为一个插件,可以在Castle中很方便地被使用。

 

    
MicroKernel和Windsor是Castle的IOC框架,通常使用的是Windsor。对于上边提到的3种注入方式,Windsor将设值注入和构造器注入作为一种来对待,同时对于类间的依赖,不需要在配置文件中体现,这种依赖框架会自动在配置文件中查找被依赖类的配置,然后自动建立关联关系。因此从这一点来看Castle的使用比Spring.net方便,但运行效率会低一些。

 

    
MonoRail也是一个从java移植来的MVC框架,被组合到Castle开源项目中。因此他也面对着和Spring.net 
的MVC框架一样的问题。

 

    
ActiveRecord是构建于Nhibernate的数据访问工具,功能强大。不过Nhibernate发展多年,直接使用会更受欢迎一些。

 

转自:http://www.cnblogs.com/VictorLiu/archive/2007/03/27/689496.html

转载于:https://www.cnblogs.com/ruishuang208/p/IOC-NET.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python热部署_关于Spring Cloud 框架热部署的方法

1、在对应的pom.xml 文件中添加依赖org.springframework.bootspring-boot-devtoolstrue2、注:project 中添加 spring-boot-maven-plugin,主要在eclipse中使用,idea中不需要添加此配置。【IDEA 忽略这个步骤哦(⊙o⊙)?】org.springframework.b…

《世界是数字的》读后感

随着科技的发展,我们已经进入数字化的世界。十年前,我们还拿着小灵通、按键手机,十年后,我们每个人的手上都有一部触屏手机。科技的发展使得世上的东西都更新换代的很快,任何东西存在的时间都很短,瞬息间就…

html js css如何关联_会html+css+js就能把前端项目发布到多个平台

在这篇文章中,小编将给大家分享如何让自己的前端代码发布到多个常用的平台。看完这篇文章以后,你就知道了如何让你的前端代码发布到多个平台,如:安卓应用程序,小程序,iOS应用程序,Windows,Mac,L…

机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖

NeurIPS 会议在提交的大量论文和1903年被接受的论文中,有3篇被授予。今年获奖的论文有:语言模型是学习者很少广义形式相关平衡的无悔学习动力学列子集选择和Nystrom方法的改进保证和多重下降曲线该NeurIPS委员会由一些指导准则。最好的论文必须具有革命性…

Java--File文件操作

判断文件或目录是否存在 判断File对象所指向的文件或者目录是否存在,使用exists()函数。 File f new File("/Users/bemaster/Desktop/in.txt"); System.out.println(f.exists()); 判断当前File对象是文件还是目录 判断当前File对象是否是文件&#xff0c…

iis 装完framework4 7 无法切换_扫盲贴之电压并列与电压切换

点击上方电气小青年,关注并星标由于微信改版,只有星标才能及时看到我们的消息哦━━━━━━推荐阅读:《国内电气顶尖高校的奖学金介绍,总奖学金接近150万!》《世界工业自动化公司行业前十名:西门子、ABB、…

unixbench类似_UnixBench的实现介绍-阿里云开发者社区

很多用户都用UnixBench做性能测试,并做厂商之间的对比,那UnixBench到底做了哪些性能测试,本篇从代码层面阐述UnixBench做了哪些测试。在细说UnixBench的实现之前,先放一个总结果UnixBench算分介绍有类似结果,然后一个个…

android 集成同一interface不同泛型_C# 基础知识系列- 10 反射和泛型(二)

0. 前言 这篇文章延续《C# 基础知识系列- 5 反射和泛型》,继续介绍C#在反射所开发的功能和做的努力。上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后通过这个类型对象操作对象。这一篇介绍一个在反射中很重…

hdu 1297 递推难题

这题的话,我能玩一年 今天做了很多递推的题,这题无疑是最复杂的 其实可以看出来,2,3,4,5为一类,不妨定义为2型,1,6为一类,定义为1型 规定num[i]为结尾是i的凹槽的数量 我们可以能轻易的推出 sum num[1]*2n…

mysql 8.0远程连接_安装mysql 8.0.17并配置远程访问的方法

一、安装前准备查看数据库版本命令: mysql --versionmysql-community-common-8.0.17-1.el7.x86_64.rpmmysql-community-libs-8.0.17-1.el7.x86_64.rpmmysql-community-client-8.0.17-1.el7.x86_64.rpmmysql-community-server-8.0.17-1.el7.x86_64.rpm二、安装RPM包依…

python体育竞技分析代码200行_使用Python进行体育竞技分析(预测球队成绩)

使用Python进行体育竞技分析(预测球队成绩) 发布时间:2020-09-18 06:38:27 来源:脚本之家 阅读:69 今天我们用python进行体育竞技分析,预测球队成绩 一. 体育竞技分析的IPO模式 : 输入I(input)&…

使用JavaScript进行数组去重——一种高效的算法

最近比较忙,没时间更新博客,等忙完这阵子会整理一篇使用AngularJS构建一个中型的单页面应用(SPA)的文章,尽情期待!先占个坑。 数组去重的算法有很多种,以下是一种。 思路如下: 定义一个空的对象obj&#xf…

rpm的mysql安装_MySQL 5.7.22 rpm 安装方式

在MySQL官网下载安装包[roothashow-db-master resource]# tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar[roothashow-db-master resource]# lsDATALOSS_WARNING_README.txt mysql-community-common-5.7.22-1.el7.x86_64.rpm mysql-communi…

为什么有时优盘是只读模式_JS专题之严格模式

ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始)一、什么是严格模式顾名思义,JavaScript 严格模式就是让 JS 代码以更严格的模式执行,不允许可能会引发错误的代码执行。在正常模式下静默失败的代码&#…

iOS开发触摸事件的传递

1. iOS中的三种事件类型 触摸事件、加速计事件、远程事件。 触摸事件:通过触摸、手势进行触发(例如手指点击、缩放) 加速计事件:通过加速器进行触发(例如手机晃动,典型应用是微信摇一摇) 远程事…

mysql router 介绍_MySQL Router 介绍篇

MySQL Router 是什么?相信还有很多人没有听说过MySQL Router,很多人对它还不了解,在这篇文章里,将对MySQL Router进行一个简明介绍。首先,介绍一下MySQL Router推出的背景。MySQL Router 是一个轻量级的中间件&#xf…

react 更新input 默认值setfieldsvalue_值得收藏的React面试题

react1、什么是虚拟DOM?难度: ⭐虚拟 DOM (VDOM)是真实 DOM 在内存中的表示。UI 的表示形式保存在内存中,并与实际的 DOM 同步。这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤,整个过程被称为调和。2、类组件和函数组件之间的区…

实验二Step1-有序顺序表

1 #include<stdio.h>2 3 struct job4 {5 char name[10];//作业名称6 char status;//当前状态7 int arrtime;//到达时间8 int reqtime;//要求服务时间9 int startime;//调度时间 10 int finitme;//完成时间 11 float TAtime,TAWtime;//周转时…

mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)

子查询的限制● 通常&#xff0c;不能在子查询中修改表并从同一表中进行选择。例如&#xff0c;此限制适用于以下形式的语法&#xff1a;1. DELETE FROM t WHERE ... (SELECT ... FROM t ...);2. UPDATE t ... WHERE col (SELECT ... FROM t ...);3. {INSERT|REPLACE} INTO t …

ocx控件 postmessage消息会消失_APP控件之二——弹框

弹框分为两种&#xff1a;模态弹框和非模态弹框一、模态弹框模态弹框和非模态弹框最大的区别就是是否强制用户交互。模态弹框会打断用户的当前操作流程&#xff0c;用户不在弹框上操作的话&#xff0c;其余功能都使用不了。优点是&#xff1a;可以很好的获取的用户的视觉焦点缺…