Spring.Net其实就是抽象工厂,只不过更加灵活强大,性能上并没有明显的区别。

  它帮我们实现了控制反转。

  其有两种依赖注入方式。

    第一:属性注入

    第二:构造函数注入

  首先,我们去  Spring.net下载 您要的版本。

  现在,我们创建一个控制台应用程序,并命名为 Spring.Net_Demo

  其次,我们在引入Spring.NET=>bin=>net=>4.0=>release文件夹下的Common.Logging.dll和Spring.Core.dll两个程序集。

  我们先来说最普通的通过其实现工厂中的实例。

  1:并在当前程序下,创建一个命名 IUserDAL 接口 ,并约束一个命名为 Show 的方法

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net_Demo
{
public interface IUserDAL
{ void Show();
}
}

  2:其次,我们在创建一命名 UserDAL 类,并实现接口 IUserDAL 中的Show 的方法

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net_Demo
{
public class UserDAL : IUserDAL
{ public void Show()
{
Console.WriteLine("我是UserDAL");
}
}
}

  3:接下来,重点就是配置,现在我们配置好App.config

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Spring.Net中注释,不然报错--> <!-- <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup> --> <!--Spring.Net块配置-->
<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 > <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
<object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> </object> </objects>
</spring> </configuration>

    4:然后我们在Program.cs中调用一下

    //这里是初始化
   IApplicationContext context = ContextRegistry.GetContext();
   创建UserDAL实例
IUserDAL userDAL = context.GetObject("UserDAL") as IUserDAL;
  //调用其方法
userDAL.Show();
Console.WriteLine("我是Spring.Net注入方法!");

       4:现在我们可以看到结果

  

-----------------------------------------------------------属性依赖注入(简单值)--------------------------------------------------------------------

  现在,我们来看看通过其属性依赖输入。

  首先,我们修改下UserDAL类,添加一个属性,并在Show方法中输出。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net_Demo
{
public class UserDAL : IUserDAL
{
public string Name { get; set; }
public void Show()
{
Console.WriteLine("我是UserDAL"+Name);
}
}
}

  其次,我们修改下App.config配置文件在object节点下,添加一个 <property name="Name" value="我是属性Name哦"></property>

  具体过程请仔细看代码。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Spring.Net中注释,不然报错--> <!-- <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup> --> <!--Spring.Net块配置-->
<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 > <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
<object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
<!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”-->
<property name="Name" value="我是属性Name哦"></property> </object> </objects>
</spring> </configuration>

  最后,在Program.cs调用不变,直接运行,结果如下:

  我们可以看到,其在App.config中就是给属性赋值操作了。

-----------------------------------------------------------属性依赖注入(复杂值)--------------------------------------------------------------------

  其属性注入,还可以注入更复杂的值。

  例如,我们在添加一个命名为:UserServer 的类。并添加一个UserDAL的属性,并添加方法Show中输出UserDAL中Name

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net_Demo
{
public class UserServer
{
public UserDAL userDAL { set; get; }
public void Show()
{
Console.WriteLine("我是UserServer"+userDAL.Name);
}
}
}

  现在,我们该改造下App.config。详情请看代码。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Spring.Net中注释,不然报错--> <!-- <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup> --> <!--Spring.Net块配置-->
<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 > <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集-->
<object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
<!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”-->
<property name="Name" value="我是属性Name哦"></property> </object> <!--这里我们在添加一个节点,属性注入复杂属性 -->
<object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo">
<!--这里属性直接指向UserDAL节点,Name属性必须对应 -->
<property name="UserDAL" ref="UserDAL"></property>
</object> </objects>
</spring> </configuration>

   现在,我们还需修改下Program.cs代码,因为我们现在是注入UserServer

  IApplicationContext context = ContextRegistry.GetContext();
//IUserDAL userDAL = context.GetObject("UserDAL") as IUserDAL;
//现在是注入UserServer
UserServer userDAL = context.GetObject("UserServer") as UserServer;
userDAL.Show();
Console.WriteLine("我是Spring.Net注入方法!");

我们可以看到,结果跟上面简单属性注入是一样。

-----------------------------------------------------------构造函数依赖注入--------------------------------------------------------------------

  构造函数注入,其实也差不多。首先,我们修改下UserDAL代码。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net_Demo
{
public class UserDAL : IUserDAL
{
public string Name { get; set; } //这里添加一个构造函数
public UserDAL(string name)
{
Name = name;
} public void Show()
{
Console.WriteLine("我是UserDAL"+Name);
}
}
}

接下来,我们依然是要修改下App.config配置文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Spring.Net中注释,不然报错--> <!-- <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup> --> <!--Spring.Net块配置-->
<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 >
<!--我们注释掉这一部分-->
<!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集
<object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo">
这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦
<property name="Name" value="我是属性Name哦"></property> </object> --> <!--这里为构造函数注入,两个选择一个就可,不在细说,有注释-->
<object>
<!--构造函数注入 Name不区分大小,对应构造参数名 -->
<constructor-arg name="name" value="构造函数注入"></constructor-arg> <!-- 构造函数注入,需声明构造, 可直接用index= -->
<!-- <constructor-arg index="" value="构造函数注入"></constructor-arg> -->
</object> <!--这里我们在添加一个节点,属性注入复杂属性 -->
<object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo">
<!--这里属性直接指向UserDAL节点,Name属性必须对应 -->
<property name="UserDAL" ref="UserDAL"></property>
</object> </objects>
</spring> </configuration>

接下,调用代码无需改变,我们看下结果。

-----------------------------------------------------------外部引入XML文件--------------------------------------------------------------------

    如果越来越多类,我们要注入,在配置文件里不会越来越多注入声明吗?

    我们可以独立把这些独立放在一个XML文件里,然后在配置文件里声明块就可以了。

    首先,我们新建一个Server.xml,在里面放入<objects>节点的所有代码。

    当然,您可以新建多个,比如在三层中,一个是DAL层,一个是BLL层等等,这里就不怎么一一展示了。

    (这里需注意下,因为我的是控制台应用程序,需右键这个XML文件,修改其属性《生成操作=> 嵌入的资源》)。

 <?xml version="1.0" encoding="utf-8" ?>
<objects>
  
<object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> <!--构造函数注入 可直接用index=-->
<constructor-arg index="" value="外部引入哦"></constructor-arg>
</object> </objects>

     然后修改下App.comfig ,详情请看代码

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Spring.Net中注释,不然报错--> <!-- <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup> --> <!--Spring.Net块配置-->
<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"/> <!-- 外部XML文件引入,在控制台中,同时需把文件属性中的生成操作改成'嵌入资源'-->
<resource uri="assembly://Spring.Net_Demo/Spring.Net_Demo/Server.xml"/>
</context>
</spring> </configuration>

    调用的话,不需要任何改变。

本文结束。

    以上两种注入方法,虽然有点啰嗦,勿介意哈,老鸟飘过哈。

    

   

Spring.Net简单用法的更多相关文章

  1. Spring中@Async用法详解及简单实例

    Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类 ...

  2. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  3. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  4. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

  5. jquery.validate.js 表单验证简单用法

    引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...

  6. NSCharacterSet 简单用法

    NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...

  7. SpringMVC +mybatis+spring 结合easyui用法及常见问题总结

    SpringMVC +mybatis+spring 结合easyui用法及常见问题总结 1.FormatString的用法. 2.用postAjaxFillGrid实现dataGrid 把form表单 ...

  8. [转]Valgrind简单用法

    [转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...

  9. Oracle的substr函数简单用法

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

随机推荐

  1. 纯命令行的编辑利器:用好 awk 与 sed

    awk 的基本语法 awk 是模式查找与处理语言,是文本处理的利器.使用 awk 可以只用一条简单的命令完成复杂的文本数据处理. awk 命令的基本结构为: awk '模式 {处理}' 文件 比如,打 ...

  2. 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序

    这不是草稿 辛巴学院:正大光明的不务正业.   上一次的教程写出来之后,反馈还是挺多的,有很多都做了修改,也有一些让人崩溃,不得不说上几句.有些人有些很奇怪的地方,你写篇东西,被看了以后不说他感觉怎么 ...

  3. .NET 新标准介绍

    本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移.文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意味着什么. 如果你对细节感兴趣,这篇文章 ...

  4. Echarts3 关系图-力导向布局图

    因为项目需要,要求实现类似力导图效果的图,我就瞄上了echarts. 注意事项1:由于我的项目要部署到内网,所以js文件要在本地,网上大多力导图都是echarts2的,而其又依赖zrender基础库, ...

  5. Loadrunner时间函数、用时间生成订单编号例子

    Loadrunner中取时间函数.用时间函数生成订单编号例子: <如要转载,请注明网络来源及作者:Cheers_Lee> 问题的提出: (1)有时候在Loadrunner中用C语言设计脚本 ...

  6. sql复习第五次

    1.在数据库范围内,关系的每一个属性值是不可分解的 关系中不允许出现重复元组 由于关系是一个集合,因此不考虑元组的顺序 2.笛卡儿积是两个关系的所有元组组合而成的,而等值联接是由笛卡儿积和选择运算组合 ...

  7. 进程管理三大扩展工具htop

    三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...

  8. 深入理解javascript中的动态集合——NodeList、HTMLCollection和NamedNodeMap

    × 目录 [1]NodeList [2]HTMLCollection [3]NamedNodeMap[4]注意事项 前面的话 一说起动态集合,多数人可能都有所了解.但是,如果再深入些,有哪些动态集合, ...

  9. java获取类的信息

    关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...

  10. .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译

    apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运 ...