zoukankan      html  css  js  c++  java
  • 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优先级等

      

  • 相关阅读:
    < java.util >-- Set接口
    Codeforces 627 A. XOR Equation (数学)
    Codeforces 161 B. Discounts (贪心)
    Codeforces 161 D. Distance in Tree (树dp)
    HDU 5534 Partial Tree (完全背包变形)
    HDU 5927 Auxiliary Set (dfs)
    Codeforces 27E. Number With The Given Amount Of Divisors (暴力)
    lght oj 1257
    Codeforces 219D. Choosing Capital for Treeland (树dp)
    Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
  • 原文地址:https://www.cnblogs.com/TeemoHQ/p/5941748.html
Copyright © 2011-2022 走看看