Spring.Net依赖注入(属性注入)学习笔记
一、前言:
Spring.Net是Java开源框架迁移过来的,主要分为
1)依赖注入
2)面向方面编程
3)数据访问抽象
4)Asp.Net扩展
四个模块功能,这里只是简单介绍依赖注入模块功能。
对于Mybatis,在这里也是简单介绍相关配置和实现插入和查找功能。
二、项目结构:
DAL\BLL\Web项目在这里不作介绍,因为本文章重点不在这里。
这里着重介绍下Spring.Net和MyBatis的东西。开始开发前,请先下载先关要引用的组件,具体下载和要引用什么组件推荐上官网了解和下载,这里不再详细赘述。
其他文件说明:
1、Res文件夹下BLLObjects.xml等文件:Spring.net框架定义依赖注入的类定义和属性。
2、Web根目录下的Webconfig定义一些Spring.net的基础配置和资源文件存放位置。
三、具体开发
1、Spring.Net模块介绍
这里以BLL层的Web层为例作介绍,其他层也是类似,读者可以举一反三。
关于Spring.Net框架的WebConfig配置如下:
1)注册Spring.Net库的dll:
1 <!--Spring.Net配置 引用Spring需要使用的类型--> 2 <configuration> 3 <configSections> 4 <sectionGroup name="spring"> 5 <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> 6 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 7 </sectionGroup> 8 </configSections>
2)添加对aspx页面注入支持:
在webconfig根节点的config节点下面的configuration的System.Web(如果没有此节点请自行添加)节点下配置如下。这个配置也是必要的,作用是添加对aspx页面注入的支持。
1 <httpHandlers> 2 <remove verb="*" path="*.asmx" /> 3 <add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web" /> 4 </httpHandlers> 5 <httpModules> 6 <!--这里不能漏,不然页面注入的时候会出错--> 7 <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> 8 9 </httpModules> 10 11
3)引入类型定义文件:
Webconfig xml根节点下配置引入定义对象的资源文件。引入资源文件分为两种方式,一种是作为资源嵌入到程序集中,如下面注释代码所示,uri="assembly://MyBlog.BLL/MyBlog.BLL/Objects.xml"/>。用这种方式要在Visual Studio资源管理器中将Objects.xml文件的生成操作属性改成嵌入的资源,不然是没把文件带进去的。这里推荐第二中方式,即本项目使用的方式,
直接使用相对路径描述资源。如:<resource uri="~/Res/Objects/BLLObjects.xml"/>。符号"~"代表根目录。
1 <spring> 2 <context> 3 <!--assembly://程序集名/命名空名/文件名(程序集内嵌资源)--> 4 <!--<resource uri="assembly://MyBlog.BLL/MyBlog.BLL/Objects.xml"/>--> 5 <resource uri="config://spring/objects" /> 6 <resource uri="~/Res/Objects/TestObjects.xml"/> 7 <!--数据库连接对象--> 8 <resource uri="~/Res/Objects/DBConfig.xml"/> 9 <resource uri="~/Res/Objects/BLLObjects.xml"/> 10 <resource uri="~/Res/Objects/DALObjects.xml"/> 11 </context> 12 <!--必要--> 13 <objects xmlns="http://www.springframework.net"> 14 </objects> 15 </spring>
4)类型定义配置:
BLLObjects.xml文件里面的内容如下所示。诸如此类的文件作用是定义类型,这个是Spring.Net注入的关键。这里解释一下下面配置文件的意思。
每一个object节点,描述了C#代码中的一个类,object节点的id是个身份标记,这个必须是唯一的;type属性描述了具体的类,这个属性由类的全名+逗号+类的命名空间构成。
例如type="MyBlog.BLL.ArtiCaManager,MyBlog.BLL"。这里描述的是BLL层中的ArtiCaManager类。而object节点下面的property 属性则是描述了这个类下面的属性,这是本项目依赖注入的关键(本项目采用的注入方式只要是属性注入和构造注入)。例如节点 :
<property name="ArtiCaDao" ref="ArtiCaDao"></property> 。
这个是ArtiCaManager类下面的属性:
public IArtiCaDao ArtiCaDao { get; set; } //文章类别数据操作类。
这个属性节点的作用是描述了IArtiCaDao接口实例化的类型是ArtiCaDao(ref="ArtiCaDao">)。而ref属性里面写的是object节点的ID,作用也是描述了一个类型。
1 <?xml version="1.0" encoding="utf-8" ?> 2 3 <objects xmlns="http://www.springframework.net" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.net 6 http://www.springframework.net/xsd/spring-objects.xsd"> 7 <!--类型的全名,然后是一个逗号,最后是类型所在的程序集名称--> 8 <!--<object id="ArtiCaMana" type="MyBlog.BLL.ArtiCaManager, MyBlog.BLL" />--> 9 10 <object id="ArtiCaMana" type="MyBlog.BLL.ArtiCaManager,MyBlog.BLL"> 11 <property name="ArtiCaDao" ref="ArtiCaDao"></property> 12 </object> 13 14 <object id="LogMana" type="MyBlog.BLL.LogManager,MyBlog.BLL"> 15 <property name="iLogDao" ref="LogDao"></property> 16 </object> 17 18 <object id="DeptMana" type="MyBlog.BLL.DepartmentManager,MyBlog.BLL"> 19 <property name="iDepartmentDao" ref="DepartmentDao"></property> 20 </object> 21 22 </objects>
5)代码实现:
BLL层ArtiCaManager类代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MyBlog.Model; using MyBlog.IDAL; using Spring.Context; using Spring.Context.Support; using MyBlog.IBLL; namespace MyBlog.BLL { /// <summary> /// 文章类别管理业务逻辑类 /// </summary> public class ArtiCaManager : IArtiCaManager { public IArtiCaDao ArtiCaDao { get; set; } //文章类别数据操作类 /// <summary> /// 插入文章类别 /// </summary> /// <param name="arCa">文章类别实体类</param> /// <returns>是否插入成功</returns> public bool InsertCa(ArticleCategory arCa) { arCa.CategoryName = arCa.CategoryName+ "[这里是调用了文章类别管理类BLL接口插入的]"; //仅供测试留个记号 return ArtiCaDao.InsertCa(arCa); } /// <summary> /// 取出所有文章类别 /// </summary> /// <returns>文章类别列表</returns> public IList<ArticleCategory> SelectAllCa() { return ArtiCaDao.SelectAllCa(); } } }
四、结论
Spiring.Net的依赖注入,主要是利用了.Net反射的特性,在xml中定义了.Net中某个对象的类型,然后框架自动实例化,好处在于提高软件的灵活性,特别是对于一个接口有多个实现的场景。
一个小问题整了两天,哎,还是太嫩了,还要继续努力呀
原文链接:https://www.cnblogs.com/still-windows7/archive/2013/04/09/2826743.html