C# IOC

  1. 啥是IOC?这货能干啥?简单不?
    IOC是Inversion of Control的缩写,CN名字叫控制反转,自我理解(我现在有的是oppo手机,有天我买了vivo。 我要玩oppo我忘放哪了,一通乱找,我要玩vivo忘放哪了,找…。记性不好,后来招个助理,这时就不用我亲自去找了,告诉助理我要玩那个就行了。)”
  2. 先来个传统的三层体验下传统方式
    结构如下
    C# IOC_第1张图片
    DAL Oppo代码
using System;
using System.Collections.Generic;
using System.Text;
namespace DAL
{
   public   class Oppo
    {
        public void PlayPhone() {
            Console.Write("~hello Oppo");
        }
    }
}

BLL

using System;
using System.Collections.Generic;
using System.Text;

namespace BLL
{
 public   class PhoneBLL
    {
        public void PlayPhone() {
            DAL.Oppo oppo = new DAL.Oppo();
            oppo.PlayPhone();
        }
    }
}

控制塔输出

using System;

namespace IOCDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            new BLL.PhoneBLL().PlayPhone();
            Console.ReadKey();
        }
    }
}

运行后
C# IOC_第2张图片3. 现在我想使用Vivo手机了,那我就要更改BLL的调用,然后重新发布,不太方便呀!再有所有手机都能玩,直接使用接口实现实现玩手机操作?改改~
C# IOC_第3张图片
实现接口

using IDAL;
using System;
using System.Collections.Generic;
using System.Text;

namespace DAL
{
 public   class Vivo:IPhone
    {
        public void PlayPhone() {
            Console.Write("~hello Vivo");
        }
    }
}

BLL层如何能够不进行修改实现调用呢?可以使用构造函数、属性、接口进行注入,就不一一实现了(俺就是想偷懒~~)

using DAL;
using IDAL;
using System;
using System.Collections.Generic;
using System.Text;
namespace BLL
{
 public   class PhoneBLL
    {
        public IPhone _iphone;
        public PhoneBLL( IPhone iphone) {
            this._iphone = iphone;
        }
        public void PlayPhone() {
            _iphone.PlayPhone();
        }
    }
}

UI 这个时候我想玩那个手机我new 那个对象就可以了

using DAL;
using IDAL;
using System;
using System.Reflection;

namespace IOCDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            IPhone iPhone = new Vivo();
            BLL.PhoneBLL phoneBLL = new BLL.PhoneBLL(iPhone);
            phoneBLL.PlayPhone();
            Console.ReadKey();
        }
    }
}
  1. 虽然现在能改尽量少的代码实现想要的操作,但还是不方便,还是要new,怎么能让它自动new呢,反射搞起来呀!改改改~
using DAL;
using IDAL;
using System;
using System.Reflection;
namespace IOCDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
           //Load(程序集名称)  CreateInstance (类名称,是否区分大小写) 
            Assembly asm = Assembly.Load("DAL");
            IPhone phone = (IPhone)asm.CreateInstance("DAL.Oppo", true);
            BLL.PhoneBLL phoneBLL = new BLL.PhoneBLL(phone);
            phoneBLL.PlayPhone();
            Console.ReadKey();
        }
    }
}

改过之后每次更换手机还是要改代码重新发布,这里可以使用配置文件实现不改代码切换使用的手机
5.

using DAL;
using IDAL;
using System;
using System.Configuration;
using System.Reflection;

namespace IOCDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            string config = ConfigurationManager.AppSettings["DAL"].ToString();
            string[] configList = config.Split(",");
            Assembly asm = Assembly.Load(configList[0]);
            //Load(程序集名称)  CreateInstance (类名称,是否区分大小写) 
            IPhone phone = (IPhone)asm.CreateInstance(configList[1], true);
            //IPhone phone = new Vivo();
            BLL.PhoneBLL phoneBLL = new BLL.PhoneBLL(phone);
            phoneBLL.PlayPhone();
            Console.ReadKey();
        }
    }
}

改配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="DAL" value="DAL,DAL.Vivo"/>
	</appSettings>
</configuration>

6.小小总结下

  1. 自我理解IOC控制反转就是实现解耦的(由明确的依赖关系变成通过中间方依赖)
  2. DI(依赖注入) 是实现IOC的一种手段(自我理解他俩就是一个东西)
  3. 它难不难呢,花了两天会用,用的对不对不大清楚
  4. IOC后耦合更低,扩展性更强,性能相对就有点拉…
  5. 后边考虑拿Unity来玩玩

最后咱也不知道这理解对不对,只要思想不滑坡,方法总比困难多,欢迎各位大佬指导呀~~

你可能感兴趣的:(备忘,c#,ioc)