Spring.NET(一)——IoC管理对象

    IoC(Inversion of Control)翻译为控制反转,在之前我们实例化一个对象是要依赖这个对象的类的,而IoC的作用是让对象依赖类变成利用IoC容器统一管理这些对象。从而是类和对象之间耦合度降低。

    实例化一个对象,有三种方式:面向接口实例化,利用抽象工厂+反射,还有今天说的利用IoC。

    先看下面的代码:一个接口,还有它的实现

namespace Demo
{
    public interface IUserInfo
    {
        void Show();
    }

namespace Demo
{
    public class UserInfo : IUserInfo
    {
        public void Show()
        {
            Console.WriteLine("hello");
        }
    }
}


     1.面向接口实例化,这是方式耦合度比较大。

namespace Demo
{
    class Program
    {
        private static void Main(string[] args)
        {
            IUserInfo userInfo=new UserInfo();
            userInfo.Show();
        }
    }
}

     2.利用抽象工厂+反射,可以不必知道具体的实现,利用工厂就可以创建出实例,这样接口和实例化对象就达到了松耦合。

namespace Demo
{
    /// <summary>
    /// 抽象工厂+反射
    /// </summary>
    public static class DALFactory
    {
        public static IUserInfo GetusUserInfo()
        {
            string classFullName = "Demo.UserInfo";
            var obj = Assembly.Load("Demo").CreateInstance(classFullName, true);</span>
            return obj as IUserInfo;
        }
    }
}

//控制台代码
namespace Demo
{
    class Program
    {
        private static void Main(string[] args)
        {
            IUserInfo userInfo = DALFactory.GetusUserInfo();
            userInfo.Show();
        }

    }
}


    3.利用IoC去管理对象。

    先是写配置文件。

<?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>
    <!--spring容器上下文,统一入口,创建的对象在config://spring/objects这个位置-->
    <context>
      <resource uri="config://spring/objects"/>
    </context>
    
    <!--容器中所有的对象-->
    <objects xmlns="http://www.springframework.net">
     <object name="UserInfo" type="Demo.UserInfoEFDal, Demo">
      </object>
    </objects>
  </spring>
</configuration>

    控制台代码

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建spring.net统一入口
            IApplicationContext ctx = ContextRegistry.GetContext();

            //控制反转,实例创建由容器创建
            IUserInfo dal = ctx.GetObject("UserInfo") as IUserInfo;
            dal.Show();

            Console.ReadLine();
        }

    }
}

总结

    从三种方式来对比了实例化一个对象的三种方式,第一种是利用面向接口编程的思想,让实现依赖接口,这样的耦合度还是很大。第二种方式利用抽象工厂加反射,这种方式可以完全不用考虑实现接口的类,直接利用工厂获取一个实例,这种方式达到了松耦合的效果;第三种方式应该也是利用了工厂模式的方式,而整个IoC更像一个封装好的工厂,只要我们写配置文件就可以实例对象,更加简单,也更灵活。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值