Spring.Net基础IOC
之前介绍过设计模式里的“工厂模式”。工厂模式的优点就不用说了,Spring.Net作为Spring在.Net的实现。提供了IOC、AOP的基础服务。Spring.NET为建立企业级应用提供了一套轻量级的解决方案。通过Spring.NET,我们可以用统一且透明的方式来配置应用程序。Spring.NET的重点是为中间层提供声明式事务管理,以及一个功能齐全的ASP.NET扩展框架。Spring.NET是非侵入式的,代码对框架本身不会产生任何依赖。这次介绍IOC基本使用。
首先下载Spring的dll和Common.Logging的dll来一会儿使用
然后创建两个C#类库一个类库放接口类,一个类库放接口实现类(把接口和实现类分开放置就是为了让上层调用对具体实现类不可见,符合程序松耦合的设计原则)
动物接口类代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyInterface
{
///<summary NoteObject="Class">
/// [功能描述:动物接口] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:动物接口]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public interface IAnimal
{
/// <summary>
/// 叫
/// </summary>
/// <returns></returns>
string Yell();
}
}
测试接口类代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyInterface
{
///<summary NoteObject="Class">
/// [功能描述:测试接口] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:测试接口]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public interface IInterfaceTest
{
/// <summary>
/// 测试方法
/// </summary>
/// <param name="info">消息</param>
/// <returns></returns>
string Test(string info);
}
}
狗实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyInterface;
namespace MyService
{
///<summary NoteObject="Class">
/// [功能描述:狗的实现类] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:狗实现类]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public class DogService : IAnimal
{
/// <summary>
/// 叫
/// </summary>
/// <returns></returns>
public string Yell() {
return "汪汪叫";
}
}
}
鸭子实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyInterface;
namespace MyService
{
///<summary NoteObject="Class">
/// [功能描述:鸭子实现类] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:鸭子实现类]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public class DuckService : IAnimal
{
/// <summary>
/// 叫
/// </summary>
/// <returns></returns>
public string Yell() {
return "嘎嘎叫";
}
}
}
接口测试的实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyInterface;
namespace MyService
{
///<summary NoteObject="Class">
/// [功能描述:测试接口实现类] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:测试接口实现类]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public class InterfaceService : IInterfaceTest
{
/// <summary>
/// 测试实现
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public string Test(string info)
{
return "我是接口实现类,我收到你的参数:"+info;
}
}
}
接口和实现类准备好之后就开始Spring.Net的搭建和使用吧
1.创建一个Winform工程,引用Spring的dll和接口dll,同时把接口dll和spring的dll及接口实现dll拷入Winform工程的Bin下
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="spring">
<!---此三项必须配置-->
<!--参数段-->
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
<!--运用程序上下文段-->
<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 xmlns="http://www.springframework.net" default-autowire="byType">
<!--系统主数据库基层配置-->
<!--狗实现类配置-->
<object id="objdog" type="MyService.DogService,MyService" singleton="false">
</object>
<!--鸭子实现类配置-->
<object id="objduck" type="MyService.DuckService,MyService" singleton="false">
</object>
<!--接口实现类配置-->
<object type="MyService.InterfaceService,MyService" singleton="false">
</object>
</objects>
</spring>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
3.对通过容器获取对象进行简单的包装,封装程度根据自己情况而定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Core;
using Spring.Context;
using Spring.Context.Support;
namespace Demo
{
///<summary NoteObject="Class">
/// [功能描述:借大黄例子一用,哈哈] <para/>
/// [创建者:hll] <para/>
/// [创建时间:2019年04月14日] <para/>
///<说明>
/// [说明:借大黄例子一用,哈哈]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///</summary>
public class Contairner
{
#region 字段
/// <summary>
/// 容器单例
/// </summary>
private readonly static IApplicationContext Ctx = ContextRegistry.GetContext();
#endregion
#region 私有构造函数
/// <summary>
/// 私有化构造函数,得到单例模式的容器
/// </summary>
private Contairner()
{
}
#endregion
/// <summary>
/// 获取容器对象
/// </summary>
/// <returns></returns>
public static IApplicationContext GetContairner()
{
if (Ctx == null)
{
return ContextRegistry.GetContext();
}
else {
return Ctx;
}
}
/// <summary>
/// 利用容器获取对象实例达到松耦合的目的
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <returns></returns>
public static T GetObject<T>()
{
IApplicationContext ApplCtx = Contairner.GetContairner();
Type ty = typeof(T);
string[] objnames = ApplCtx.GetObjectNamesForType(ty);
return (T)ApplCtx.GetObject(objnames[0]);
}
/// <summary>
/// 利用容器获取对象实例达到松耦合的目的
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <returns></returns>
public static T GetObjectByID<T>(string id)
{
IApplicationContext ApplCtx = Contairner.GetContairner();
return (T)ApplCtx.GetObject(id);
}
}
}
4.创建一个窗口测试对象获取调用
事件代码,达到调用方与实现类解耦
/// <summary>
/// 按名称获得狗对象
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDog_Click(object sender, EventArgs e)
{
IAnimal IAObj = Contairner.GetObjectByID<IAnimal>("objdog");
MessageBox.Show(IAObj.Yell());
}
/// <summary>
/// 按名称获得鸭对象
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDuk_Click(object sender, EventArgs e)
{
IAnimal IAObj = Contairner.GetObjectByID<IAnimal>("objduck");
MessageBox.Show(IAObj.Yell());
}
/// <summary>
/// 接口测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnInterface_Click(object sender, EventArgs e)
{
IInterfaceTest obj = Contairner.GetObject<IInterfaceTest>();
MessageBox.Show(obj.Test(txtInterface.Text));
}
5.测试效果
解除耦合的关键点(实现类配置化,实现类不可见)
本事列代码基于HLL的联系修改,代码可以到下载里下载名称“Spring练习”