Spring.Net基础IOC

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhanglianzhu_91/article/details/89295639

之前介绍过设计模式里的“工厂模式”。工厂模式的优点就不用说了,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下
在这里插入图片描述
在这里插入图片描述

2.在app.config里配置spring.net
在这里插入图片描述

<?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练习”

猜你喜欢

转载自blog.csdn.net/zhanglianzhu_91/article/details/89295639