欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-08-17 14:49:01
      到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例...

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

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. 然后我们需要了解当前的程序集名称和命名空间

   

 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 name="class" type="springnetdemo.class,springnetdemo">
 <property name="name" value="尖子班"/>
 <property name="monitor" ref="student"/>
 </object>
 <object name="student" type="springnetdemo.student, springnetdemo">
 <property name="name" 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 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="file://services.xml"/>
 </context>
 </spring>
</configuration>

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

成功实现ioc

spring.net在asp.net mvc中的使用

方法和在控制台程序中大同小异

1. 同样,首先要导入dll文件

   

mvc项目中需要引用的dll文件稍多些,需要五个,除了值钱的两个外,还需要三个web相关的dll。

2. 为了便于管理,我们在mvc项目更目录新建config文件夹来保存配置文件,并在其中新建两个xml文件

controllers.xml:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">、
 <object type="pms.webapp.controllers.usercontroller , pms.webapp" singleton="false" >
 <property name="userservice" ref="userservice" />
 </object>
</objects>

services.xml:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
 <object name="userservice" type="pms.bll.userservice, pms.bll" singleton="false" >
 </object>
</objects>

同样是出于方便管理考虑,我们将控制器和业务类分两个文件来保存,文件中节点的规则与控制台示例中完全相同。

3.修改web.config配置文件

在配置文件的configsections节点中增加如图的sectiongrup节点,configuration节点中增加spring节点,并在spring节点中的context节点中使用resource节点设置配置文件的路径。

4. 修改global文件

修改根目录的global.asax文件,将mvcapplication类的父类由httpapplication更改为springmvcapplication。

复制代码 代码如下:
public class mvcapplication : springmvcapplication//httpapplication

5. 最后,将原来的控制器中代码修改,就成功地在mvc项目中使用spring.net实现了ioc

//private iuserservice _userservice;
//private iuserservice userservice
//{
// get { return _userservice ?? (_userservice = new userservice()); }
// set { _userservice = value; }
//}
private iuserservice userservice { get; set; }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。