那今天就介绍一下我理解的Spring.net吧。介绍Spring.NET之前,先谈点其他的。我们都知道,.NET有一个基本原则“高内聚,低耦合“。关于这个概念,想必大家都知道。所谓高内聚,也就是模块内部内聚,各个模块之间“低耦合”。也就是结耦,降低耦合度。所以我们选取了传统的三层,把,数据访问层,业务逻辑层,UI层分离,降低耦合度!
但是这还不够,我们为了让业务逻辑层与数据访问层彻底结耦。可以用面向接口编程的思想,采用抽象工厂模式。也就是建立工厂,采用映射的方式,使业务逻辑层与数据访问层结耦。这 确实解决了很多问题,但是,如果让业务逻辑层与UI层也进行结耦。我们如果仍然采用抽象工厂模式,建立工厂,信息写入配置文件,采用映射。那岂不是很麻烦??所以,我们引出了我们今天的内容,Spring.NET.
Spring本是java的一个框架,如今,它已经完美的发展成了几个技术的框架。Spring.NET就是一个很好的例子。那么Spring.Net有什么作用呢?他有着很强大的功能,就是提到的Ioc与DI。所谓Ioc,也就是创建实例,创建对象,相当于刚刚提到的抽象工厂的作用。所谓DI,就是“依赖注入”,可以给某一属性进行赋值等。
今儿就介绍IoC(创建对象的权利由开发人员自己控制new,转到了由容器来控制)DI(在对象初始化时可以给一些属性,构造方法的参数等注入默认值,可以是复杂类型)的具体使用方法吧。Spring.NET的工作,都是在配置文件里面进行的。所以,叙述,和读起来,难免的都会费劲。
1.自然是添加程序集的引用了
这似乎是所有技术都难逃的步骤,程序集网上或者Demo里面也都可以找到,引用上即可。
2. 配置文件内,写入以下代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<description>An example that demonstrates simple IoC features.</description> </objects>
</spring>
</configuration>
3.IoC的实现
(Ioc)需要new的类,放到在<objects></objects>节点中的object节点里面, 其中name为类名,可以随意定义,type:前半部分为创建的类的全名,后半部分为类所在的程序集-->
<object name="UserInfoService"type="SpringNet.UserInfoService,SpringNet">
</object>
使用时使用下面代码就可以了
IApplicationContext ctx = ContextRegistry.GetContext();
IUserInfoService lister = (IUserInfoService)ctx.GetObject("UserInfoService");
。使用时如果需要更换具体的对象,只需要在配置文件里面改动就可以了
4.(DI的实现)给这个类加一个属性,也可以加多个,就在object节点里面加<property/>节点就可以了
例如:<object name="UserInfoService" type="SpringNet.UserInfoService,SpringNet">
<!--给这个类加一个属性,也可以加多个-->
<!--属性名字,值:直接赋值。这就为类里面的name属性,赋了一个值-->
<property name="name" value="志华"/>
</object>
如果里面有一个复杂的数据类型,比如有个person类,那么就只用链接属性注入,假如UserInfoService类有一个person类的字段。就如下面这样注入
<object name="UserInfoService" type="SpringNet.UserInfoService,SpringNet">
<!--给这个类加一个属性,也可以加多个-->
<!--属性名字,值:直接赋值-->
<property name="name" value="志华"/>
<!--指向下面的object节点-->
<property name="per" ref="Myperson"/>
</object>
<!--让上面的ref属性进行指向 相当于实例化一下-->
<object name="Myperson" type="SpringNet.Person,SpringNet">
<property name="Age" value="21"/>
</object>
如果调用的话,这样就可以获得具体的实例数据,以及属性了。
5.到现在为止就基本算结束了,如果项目过大,我们可以采取分离的机制
在<spring>节点下的<context>节点中,如下面的属性,就指向了另外一个xml文件。刚才的配置,就可以写在新的文件里面了,效果是一样的
<resource uri="file://Service.xml"/><!--引用的地址,从bin/debug文件夹下找,所以我们得注意地址 右击文件属性,把 复制到输出目录,定义为始终复制-->