1.认识spring.net
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。
企业级应用一般由多个物理层组成,每个物理层也经常划分为若干功能层。不同层次之间需要相互协作,例如,业务服务层一般需要使用数据访问层的对象来实现某个用例。不管应用程序如何构建,最终都会表现为一系列相互协作的对象,这些对象一起组成了完整的应用程序。所以我们说,应用程序中的对象之间相互具有依赖性。
.NET平台为构建应用程序提供了丰富的功能,从非常基础的基元类型和基础类库(以及定义新类的方法),到功能完善的应用程序服务器和Web框架,都有很好的支持。但.NET平台本身并没有提供任何方式来管理基础的应用模块并将它们组合为一个相互协作的整体,只能依靠架构师或开发人员去创建(一系列)应用程序。诚然,目前有很多设计模式可用于业务系统的设计,我们可以使用这些模式将各种类或对象组合成能够正常工作的完整应用。工厂、抽象工厂、Builder、装饰及服务定位器(Service Locator)等模式已被现今的软件开发行业广泛接受和采用(这也许正是这些模式最早被定型为模式的原因)。这些模式都非常好,但也不过是些已命名的最佳编程方法,在对这些模式的介绍中一般还会说明它们是作什么用的、最好应用到什么场合、可以解决什么问题等等。我们可以从许多书籍和wiki上找到这些模式,然后仔细研读,然后实现在我们自己的应用中。
Spring.NET的IoC容器所解决的,正是如何在企业应用中将类、对象和服务组合成应用程序的问题。IoC容器通过很正统(按:formalized,言下之意是这些方式都是已经定型了的、经过了业界多年考验的)的方式将分散的组件组合成完整的应用程序。Spring.NET框架所采用的,都是被业界无数应用程序考验多年的、已经被定型为设计模式的最佳编程方式,实际上,这些模式已经成为我们架构和开发时的法典,而通过Spring.NET,我们可以直接将它们整合到自己的应用程序中。目前已有很多组织和机构用Spring框架开发出了强壮的、维护性好的应用程序,这确实是一件非常好的事情。
2.spring.net 组件功能说明
这里引用一篇博客的地址 http://blog.csdn.net/lee576/article/details/8621212 (已经写的很详细了)
(主要运用到两个dll)
Common.Logging.dll
Spring.Core.dll
3.学习从demo开始
demo环境是vs2013
创建新解决方案--》创建控制台应用程序(随便你创建什么,你做主)--》利用nuget 加载spring.net 包
项目:
如何使用nuget程序包 (http://springframework.net/)
- 在你的控制台项目上点击右键
这里,我选择的是 Spring.Web.MV4 ,直接点击安装就ok了。(安装后,在项目的文件下,多了packages文件夹,记着 ,把这个文件夹拷贝出来,以后,直接引用里面的dll文件就ok了,不需要使用NuGet)
接下来就开始实现
控制反转(工厂模式):
代码实现:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using Spring.Context; using Spring.Context.Support; namespace IOCTest { internal class Program { private static void Main(string[] args) { //创建容器对象 IApplicationContext ctx = ContextRegistry.GetContext(); IPerson p = (IPerson)ctx.GetObject("MyPerson"); p.SayHello(); Console.ReadKey(); } } public interface IPerson { void SayHello(); } public class Person : IPerson { public string Name { get; set; } public int Id { get; set; } public Car MyCar { get; set; } public Person() { Console.WriteLine("无参构造方法被调用"); } public Person(string name) { Console.WriteLine("string参构造方法被调用"); Name = name; } public Person(int id) { Console.WriteLine("int参构造方法被调用"); Id = id; } public Person(int id, string name) { Console.WriteLine("int+string参构造方法被调用"); Name = name; Id = id; } public void SayHello() { Console.WriteLine(Name+" : Say Hello "+MyCar.Brand); } } public class Car { public string Brand { get; set; } } }
App.config:
<?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> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> <description>An example that demonstrates simple IoC features.</description> <!--name:object的名称 ,type:'关于类型的完全限定名(命名空间+类名),类的程序集名称(命名空间)'--> <object name="MyPerson" type="IOCTest.Person,IOCTest"> <!--<property name="Brand" value="Audi"/>--> <!--constructor 定义构造方法 index :参数索引,value:参数值 调用还有一个参数的构造函数--> <!--<constructor-arg index="0" value="10"/>--> <!--name: 构造方法的形参 value 是实参--> <!--<constructor-arg name="id" value="10"/>--> <!--<constructor-arg value="yzhou"/>--> <!--type:构造函数形参的类型--> <!--<constructor-arg type="string" value="10"/>--> <constructor-arg index="0" value="10"/> <constructor-arg index="1" value="yzhou"/> <!--属性的依赖注入--> <property name="Name" value="yzhou1111"/> <property name="MyCar" ref="Car1"/> </object> <object name="Car1" type="IOCTest.Car,IOCTest"> <property name="Brand" value="Audi"/> </object> </objects> </spring> </configuration>
暂时不看配置文件中的spring节点
步骤:
先添加 configSections
<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>
注意:要将 configSections 节点 必须是 configuration节点的第一个子节点
不然会报错“配置系统未能初始化”
再添加spring节点
<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>
简单来说,一个类在spring节点中对应的是一个object,
形式:
<objects> <object name="名称随便起,不过这个表示的需要实例化类的番号" type=“(类的完全限定名 命名空间+类名),(类的程序集名称 一般指命名空间,因为程序集的名称是可以修改的)”></object> </objects>
依赖注入:(构造方法+属性)、
- 构造方法:(关键字 constructor-arg) 注意 每个object里面constructor-arg的个数,表示有几个形参的构造函数
多种形式:
<constructor-arg index="0" value="10"/> :表示 还有一个参数的构造函数,以类中构造函数的上下排序的。若有两个还有1个参数的构造函数,那么哪个在上就用谁;
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="zhangsan"/> : 表示两个参数的构造函数。;
<constructor-arg name="id" value="10"/>: name的值代表构造函数中形参的字符;
<constructor-arg type="string" value="10"/>: type表示构造函数中形参的类型,来区分
- 属性:(关键字 property)
<property name="Name" value="yzhou1111"/> Name 表示,类中属性字段
<property name="MyCar" ref="Car1"/> 注意ref 的使用,在Person类中,定义了 Car类当作属性字段,所以就用ref