Unity IOC简单认知

看了不少IOC的文章。简单概念梳理下。


1.依赖,依赖倒置,控制反转(IOC),依赖注入

  解释是仿照http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html的例子。

  依赖:类和类之间的联系。例如播放器类依赖媒体文件类

  依赖倒置:本来是A类依赖B类。现在创建IB接口类。让A和B不再互相依赖,A类只知道自己需要调用IB接口的类。例如实现媒体文件接口类。好处在于下次再有新的媒体文件, 播放器类不用重构。

  控制反转:本来A类要调用B类就需要创建B类实例,A类要调用C类就需要创建C类实例,而现在具体是调用哪个实例是由配置控制。例如:创建媒体文件类的工作不再由播放器类来完成。Main方法配置去控制是MP3文件还是默认文件。

  依赖注入:当创建调用者的时候,IOC容器会向调用注入被调用的实例,因此也称为依赖注入。例如IOC的构造函数注入

  下面贴下代码:方便以后回忆的时候看。

  class Program
    {
        static void Main(string[] args)
        {
            UnityContainer container = new UnityContainer();
            container.RegisterType<IPlayer, WYYPlayer>();
            container.RegisterType<IPlayer, DefalutPlayer>();
            container.RegisterType<IMediaFile, MP3MediaFile>();
            container.RegisterType<IMediaFile, DefaultMediaFile>();

            var op1 = container.Resolve<Operation>();
            op1.Do();

            //以前的调用方法
            //var op2 = new Operation(new 网易云Player(),new MP3MediaFile());
            //op2.Do();


            Console.ReadKey();
        }
    }

    public class Operation
    {
        IMediaFile _mtype;
        IPlayer _player;

        public Operation(IPlayer player, IMediaFile mtype)
        {
            _player = player;
            _mtype = mtype;
        }

        public void Do()
        {
            _player.play(_mtype);
        }
    }
    public interface IPlayer 
{
    
void play(IMediaFile file);
   }
public class DefalutPlayer: IPlayer { public void play(IMediaFile file) { Console.Write("默认:"+file.Name); } } public class WYYPlayer : IPlayer { public void play(IMediaFile file) { Console.Write("网易云:" + file.Name); } } public interface IMediaFile { string Name { get; set; } }
public class DefaultMediaFile: IMediaFile { public string Name { get; set; } = "默认文件"; } public class MP3MediaFile : IMediaFile { public string Name { get; set; } = "MP3文件"; }

  后续:UNITY 容器注入什么就拿到什么。想做到插件式开发。还需要定制注入的规则。

  说个插件式开发流程:比如有A实现,B实现。我想要真正来做的是B的方法。

  1.反射A,B拿到AB的type。

  2.在RegisterType的时候根据具体情况注入哪个。比如数组排序,比如type优先级等

  

原文地址:https://www.cnblogs.com/TeemoHQ/p/5941748.html