zoukankan      html  css  js  c++  java
  • IoC与DI,Unity的使用

    IoC的全称为Inversion of Control(控制反转),DI的全称为Dependency Injection(依赖注入)。IoC是一个控制容器,我们将设计好的对象放入到容器中,将对象交给容器去主动创建。DI是容器的运行机制,在IoC容器的运行期间,动态的将对象所依赖的对象注入到对象之中。

    关于IoC框架有很多,比如从Java中移植过来的Spring.NET和微软的Unity等,这篇文章主要介绍Unity的使用。

    我们拿人与手机来做一个示例,在示例中我们需要输出这个人在玩什么手机的一段文字,所以我们需要一下类:

    • People:人类
    • Phone:手机类

    People类依赖Phone类,但没有在People类中主动new依赖对象,而是添加了一个带有参数的构造方法,等待依赖对象被注入:

    public interface IPeople
    {
        void PlayPhone();
    }
    
    public class People : IPeople
    {
        IPhone _phone = null;
        public People(IPhone phone)
        {
            _phone = phone;
        }
    
        public void PlayPhone()
        {
            Console.WriteLine("Play {0}", _phone.IPhoneXS());
        }
    }
    
    public interface IPhone
    {
        string IPhoneXS();
    }
    
    public class Phone : IPhone
    {
        public string IPhoneXS()
        {
            return "iPhone XS";
        }
    }
    

    通过注册的方式在控制台输出文字:

    static void Main(string[] args)
    {
        // 初始化容器
        UnityContainer unityContainer = new UnityContainer();
    
        // 注册依赖对象
        unityContainer.RegisterType<IApple, Apple>();
        // 注册调用者
        unityContainer.RegisterType<IPeople, People>();
    
        // 返回调用者
        IPeople people = unityContainer.Resolve<IPeople>();
        people.PlayPhone();
        
        Console.ReadLine();
    }
    

    通过传参的方式在控制台输出文字:

    static void Main(string[] args)
    {
        // 初始化容器
        UnityContainer unityContainer = new UnityContainer();
    
        // 注册调用者
        unityContainer.RegisterType<IPeople, People>();
    
        // 返回调用者并传递参数
        // Unity 5.9.x版本语法
        ParameterOverride param = new ParameterOverride("phone", new Phone { Name = "IPhone XS" });
        IPeople people = unityContainer.Resolve<IPeople>(param);
        
        // Unity 5.8.x及以下版本语法
        //IPeople people = unityContainer.Resolve<IPeople>(new ParameterOverrides
        //{
        //    { "apple", new Apple() }
        //});
        
        people.PlayPhone();
        
        Console.ReadLine();
    }
    

    使用IoC容器可以使对象与对象之间的耦合降低,这样整体的架构就变得更加的灵活,维护起来也会变得更加的方便。



    作者:huayueniansi
    链接:https://www.jianshu.com/p/b30f42245d01
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    [GIT]指定分支下创建分支
    [架构]辨析: 高可用 | 集群 | 主从 | 负载均衡 | 反向代理 | 中间件 | 微服务 | 容器 | 云原生 | DevOps
    [Linux]常用命令之【vi/grep/find】
    [Linux]常用命令之【netstat/ps/lsof/ss/kill/】
    [Linux]常用命令之【nl/sed/awk/wc/xargs】
    移动端vw页面适配方案在vue项目中的应用
    关于跨域,你应该知道的
    关于call、apply和bind,请看这篇
    JavaScript数组常用API方法汇总
    JS浅拷贝与深拷贝实现方式
  • 原文地址:https://www.cnblogs.com/Jeely/p/10950787.html
Copyright © 2011-2022 走看看