为了账号安全,请及时绑定邮箱和手机立即绑定

[IOC]Unity使用

标签:
JavaScript

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("会叫....");        }    }

复制代码

结果

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消