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优先级等

      

  • 相关阅读:
    False注入,以及SQL注入技巧总结
    xdebug插件攻击
    RPO攻击
    教务处sso设计缺陷
    MD5的Hash长度扩展攻击
    AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM
    弄懂JDK、JRE和JVM之间的联系。
    MyBatis配置及学习
    Cannot forward after response has been committed 异常原因
    bbs论坛中的问题和心得。(更新)
  • 原文地址:https://www.cnblogs.com/TeemoHQ/p/5941748.html
Copyright © 2011-2022 走看看