[IOC]Unity使用

Unity是什么?

unity是patterns&practices团队开发的一个轻量级、可扩展的依赖注入容器。

Unity特性

1、它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。

2、Unity允许将预先配置的对象注入到类中,实现了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(构造器注入),property setter injection(属性设置值注入)和method call injection(方法注入)。

3、支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。

4、可以通过配置文件进行准备和配置容器。

5、不会影响到类的定义(属性设置值注入和方法注入除外),这也是轻量级容器的一个体现。

6、支持自定义的容器扩展。

Unity实践

新建一个控制台程序,Nuget安装Unity

新建一个叫IFlyable 飞行能力的接口。

    /// <summary>
    /// 飞行接口
    /// </summary>
    public interface IFlyable
    {
        void Fly();
    }

一个飞禽类,并实现飞行的接口

    /// <summary>
    /// 飞禽类
    /// </summary>
    public class Bird : IFlyable
    {
        public void Fly()
        {
            Console.WriteLine("会飞的鸟......");
        }
    }

在Main方法中,通过Unity容器实例化一个飞禽对象,并让它飞。

        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            //注入
            container.RegisterType<IFlyable, Bird>();
            IFlyable bird = container.Resolve<IFlyable>();
            bird.Fly();
            Console.Read();

        }

输出

 如果多个实现类呢?

添加个飞机类,让其实现飞行接口

    /// <summary>
    /// 飞机
    /// </summary>
    public class Plane : IFlyable
    {
        public void Fly()
        {
            Console.WriteLine("超音速飞行......");
        }
    }

main方法

        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            //注入
            container.RegisterType<IFlyable, Bird>();
            container.RegisterType<IFlyable, Plane>();
            IFlyable bird = container.Resolve<IFlyable>();
            IFlyable plane = container.Resolve<IFlyable>();
            bird.Fly();
            plane.Fly();
            Console.Read();

        }

结果

Unity:在一个接口有多个实现的情况下,如果没有进行别名区分,会选择最后注入的实现。

加入别名

        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            //注入
            container.RegisterType<IFlyable, Bird>("bird");
            container.RegisterType<IFlyable, Plane>("plane");
            IFlyable bird = container.Resolve<IFlyable>("bird");
            IFlyable plane = container.Resolve<IFlyable>("plane");
            bird.Fly();
            plane.Fly();
            Console.Read();

        }

结果

注意

当一个接口有多个实现类的时候,注入的时候需要通过别名进行区分。

构造函数注入

我们添加一个接口

    /// <summary>
    /// 具有会叫能力的接口
    /// </summary>
    public interface ISayable
    {
        IFlyable Fly { set; get; }
        void Say();
    }

添加一个鹦鹉类,有飞行能力,并且会叫

    /// <summary>
    /// 鹦鹉类
    /// </summary>
    public class Parrot : ISayable
    {
        public IFlyable Fly
        {
            get;
            set;
        }
        public Parrot(IFlyable fly)
        {
            this.Fly = fly;
        }


        public void Say()
        {
            Console.WriteLine("会叫....");
        }
    }

main方法中,注入

        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            //注入
            //构造函数中注入 鸟类对象
            container.RegisterType<IFlyable, Bird>();
            container.RegisterType<ISayable, Parrot>();
            ISayable Parrot = container.Resolve<ISayable>();
            Parrot.Fly.Fly();
            Parrot.Say();
            Console.Read();

        }

结果

属性注入

    /// <summary>
    /// 鹦鹉类
    /// </summary>
    public class Parrot : ISayable
    {
        [Dependency]
        public IFlyable Fly
        {
            get;
            set;
        }
        public void Say()
        {
            Console.WriteLine("会叫....");
        }
    }

通过在属性上面添加[Dependency]特性,即可注入。

Main方法与上面的相同。

结果同样。

初始化器注入

说是初始化器,其实就是一个方法。但是个特别的方法,这个方法需要添加特性[InjectionMethod]  

    /// <summary>
    /// 鹦鹉类
    /// </summary>
    public class Parrot : ISayable
    {
       
        public IFlyable Fly
        {
            get;
            set;
        }
        [InjectionMethod]
        public void Init(IFlyable fly)
        {
            this.Fly = fly;
        }
        public void Say()
        {
            Console.WriteLine("会叫....");
        }
    }

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 unity的框架,除了各大公司自己内部使用的,开源并好用的实际并不是很多,我会慢慢挖掘,依次写出自己的一点见解,错误的地方,望各路大神指正。 一、基本概念 控制反转(Inversion of Control,英文缩写为IOC),我的理解就是,原本A类要获取B类的对象,需要你在A类中自己New一个对象,那么是由A来获取并控制B的对象,IOC就是把对象获取的这个过程交给容器和依赖注入来处理,A类并不知道B的对象是哪里来的,对B对象的控制,由自己变成了其他类,官方一点的概念可以百度,这个还是蛮多的。 二、StrangeIOC基础类型 实际要理解一个框架的类型,还是要自己看源码,这里我只说一下几个重要类型的作用,这个看源码的时候有个印象,也方便理解,而且说这部分的帖子也很多,我就不再赘述了。 1.Context 上下文组件定义程序边界,也就是可以把一个程序定义成多上下文,让代码更加模块化 它提供了程序入口,也算是框架中耦合度最高的地方 2.Binder和Binding 这两个类是这个框架最重要的组成部分 Binding存储了对象的绑定关系,而Binder存储了Binding的对象 3.View和Mediator MVCS中的View层,View只用于显示,也就是View只负责管理UI,Mediator负责界面逻辑,事件响应等 4.Model MVCS中的Model层,负责数据部分 5.Command MVCS中的Control层,负责执行逻辑代码 6.Service MVCS中的Service层,负责与第三方交互,这个Service我理解的,并不是一定指代服务器,也可以是其他的软件,什么都可以,它就是我们程序对外的接口 7.Dispatcher 派发器是框架内通信主线的其中一种,用来派发消息,触发命令,从而进一步解耦 8.Signal 信号是框架内另外一种通信主线,它采用强类型,来绑定信号和命令之间的关系,实现消息响应的触发 9.ReflectionBinder 反射部分,通过binding来获取类的信息,存储在ReflectedClass中 10.injector 注入器,通过反射获取的信息,来实例化请求的对象 --------------------- 作者:蓝天小僧 来源:CSDN 原文:https://blog.csdn.net/zcaixzy5211314/article/details/80876228 版权声明:本文为博主原创文章,转载请附上博文链接!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值