MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3

到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码:

private IUserService _userService; private IUserService UserService { get { return _userService ?? (_userService = new UserService()); } set { _userService = value; } }

面向接口编程,Controller应该只依赖于站点业务层的接口,而不能依赖于具体的实现,否则,就违背了在层之间设置接口的初衷了。

另外,如果上层只依赖于下层的接口,在做单元测试的时候,就可以用MoqFakes等Mock工具来按实际需求来模拟接口的实现,就可以灵活的控制接口的返回值来对各种情况进行测试,如果依赖于具体的实现,项目的可测试性将大大减小,不利于进行自动化的单元测试。

要不依赖于具体的实现,就不能使用通常的 T t = new T() 的方式来获得一个类的实例了,需要通过IOC容器来对对象生命周期,依赖关系等进行统一的管理,这里,我们将使用Spring.Net应用IOC。 

Spring.Net在控制台程序中的使用 

我们将通过一个简单的控制台示例来展示Spring.Net的使用方法

创建测试用的类:

namespace SpringNetDemo { public interface IClass { string Name { get; set; } Student Monitor { get; set; } string GetMsg(); } public class Class : IClass { public string Name { get; set; } public Student Monitor { get; set; } public string GetMsg() { return "班级名称:" + Name + ",班长:" + Monitor.Name; } } public class Student { public string Name { get; set; } } }

两个类,一个接口,Student类中有一个string类型的属性,为Name,Class类中除了string类型的Name属性外还有一个Student类型的Monitor属性,方法GetMsg可以返回当前Class对象的简介,包括班级名和班长名两个内容。Class类实现IClass接口。 

先做简单的测试:

IClass c6=new Class() { Monitor = new Student() { Name = "李芙蓉" }, Name = "六班" }; Console.WriteLine(c6.GetMsg()); Console.ReadKey();

输出为:

接下来,我们换用Spring.Net容器来声明对象

1. 首先引用dll文件

需要核心库Spring.Core.dll和Spring.Net使用的日志记录组件Common.Logging.dll

2. 然后我们需要了解当前的程序集名称和命名空间

MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3

3. 在项目中新建一个xml文件,命名为services.xml:

<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <description>An example that demonstrates simple IoC features.</description> <object type="SpringNetDemo.Class,SpringNetDemo"> <property value="尖子班"/> <property ref="Student"/> </object> <object type="SpringNetDemo.Student, SpringNetDemo"> <property value="陈二蛋"/> </object> </objects>

在xml中新建objects根节点,其中加入需要容器生成的object子节点,object子节点的type属性中需要指明类的完整名称(带有程序集)和当前命名空间,如果需要为当前类的属性赋默认值,则可以在object节点中增加property节点,配置其value属性来为类的属性赋初值,若类的属性仍然为其他类对象时,可以新建该类型的object节点,并给予其name属性,再在当前属性的property节点中将ref属性,指向新增object节点的name属性。

注意:要把xml文件设置为“如果较新则复制”或者“始终复制”,否则生成时将不会自动复制到程序目录

4.然后在应用程序配置文件中配置Spring.Net的信息:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup> <section type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <spring> <context> <resource uri="file://services.xml"/> </context> </spring> </configuration>

运行程序,得到输出结果:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyddy.html