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 飞行能力的接口。

  1. /// <summary>
  2. /// 飞行接口
  3. /// </summary>
  4. public interface IFlyable
  5. {
  6. void Fly();
  7. }

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

  1. /// <summary>
  2. /// 飞禽类
  3. /// </summary>
  4. public class Bird : IFlyable
  5. {
  6. public void Fly()
  7. {
  8. Console.WriteLine("会飞的鸟......");
  9. }
  10. }

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

  1. static void Main(string[] args)
  2. {
  3. IUnityContainer container = new UnityContainer();
  4. //注入
  5. container.RegisterType<IFlyable, Bird>();
  6. IFlyable bird = container.Resolve<IFlyable>();
  7. bird.Fly();
  8. Console.Read();
  9.  
  10. }

输出

如果多个实现类呢?

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

  1. /// <summary>
  2. /// 飞机
  3. /// </summary>
  4. public class Plane : IFlyable
  5. {
  6. public void Fly()
  7. {
  8. Console.WriteLine("超音速飞行......");
  9. }
  10. }

main方法

  1. static void Main(string[] args)
  2. {
  3. IUnityContainer container = new UnityContainer();
  4. //注入
  5. container.RegisterType<IFlyable, Bird>();
  6. container.RegisterType<IFlyable, Plane>();
  7. IFlyable bird = container.Resolve<IFlyable>();
  8. IFlyable plane = container.Resolve<IFlyable>();
  9. bird.Fly();
  10. plane.Fly();
  11. Console.Read();
  12.  
  13. }

结果

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

加入别名

  1. static void Main(string[] args)
  2. {
  3. IUnityContainer container = new UnityContainer();
  4. //注入
  5. container.RegisterType<IFlyable, Bird>("bird");
  6. container.RegisterType<IFlyable, Plane>("plane");
  7. IFlyable bird = container.Resolve<IFlyable>("bird");
  8. IFlyable plane = container.Resolve<IFlyable>("plane");
  9. bird.Fly();
  10. plane.Fly();
  11. Console.Read();
  12.  
  13. }

结果

注意

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

构造函数注入

我们添加一个接口

  1. /// <summary>
  2. /// 具有会叫能力的接口
  3. /// </summary>
  4. public interface ISayable
  5. {
  6. IFlyable Fly { set; get; }
  7. void Say();
  8. }

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

  1. /// <summary>
  2. /// 鹦鹉类
  3. /// </summary>
  4. public class Parrot : ISayable
  5. {
  6. public IFlyable Fly
  7. {
  8. get;
  9. set;
  10. }
  11. public Parrot(IFlyable fly)
  12. {
  13. this.Fly = fly;
  14. }
  15.  
  16. public void Say()
  17. {
  18. Console.WriteLine("会叫....");
  19. }
  20. }

main方法中,注入

  1. static void Main(string[] args)
  2. {
  3. IUnityContainer container = new UnityContainer();
  4. //注入
  5. //构造函数中注入 鸟类对象
  6. container.RegisterType<IFlyable, Bird>();
  7. container.RegisterType<ISayable, Parrot>();
  8. ISayable Parrot = container.Resolve<ISayable>();
  9. Parrot.Fly.Fly();
  10. Parrot.Say();
  11. Console.Read();
  12.  
  13. }

结果

属性注入

  1. /// <summary>
  2. /// 鹦鹉类
  3. /// </summary>
  4. public class Parrot : ISayable
  5. {
  6. [Dependency]
  7. public IFlyable Fly
  8. {
  9. get;
  10. set;
  11. }
  12. public void Say()
  13. {
  14. Console.WriteLine("会叫....");
  15. }
  16. }

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

Main方法与上面的相同。

结果同样。

初始化器注入

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

  1. /// <summary>
  2. /// 鹦鹉类
  3. /// </summary>
  4. public class Parrot : ISayable
  5. {
  6.  
  7. public IFlyable Fly
  8. {
  9. get;
  10. set;
  11. }
  12. [InjectionMethod]
  13. public void Init(IFlyable fly)
  14. {
  15. this.Fly = fly;
  16. }
  17. public void Say()
  18. {
  19. Console.WriteLine("会叫....");
  20. }
  21. }

结果

[IOC]Unity使用的更多相关文章

  1. IOC : Unity 配置和使用

    原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...

  2. IOC Unity

    1. 依赖倒置原则和IOC2. IOC(Inversion of Control)的好处3. 介绍和使用Unity依赖倒置原则(DIP):上层和下层之间,依赖抽象,而不依赖细节IOC 控制反转,把上端 ...

  3. .Net Ioc Unity

    Unity 的接口IUnityContainer public interface IUnityContainer : IDisposable IUnityContainer RegisterType ...

  4. .net web api ioc unity usage

    1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...

  5. .Net IOC 之Unity

    .Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...

  6. IOC容器:Unity

    一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...

  7. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  8. 【Unity】微软的一款依赖注入组件

    前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...

  9. _appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml

    ASP.NET MVC3 系列教程 – Web Pages 1.0 I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart ...

随机推荐

  1. SQL select结果集和return的区别

    IF EXISTS (SELECT 1 FRIN sys.objects where object_id=OBJECT_ID(N'[dbo].[testReturn_up]')AND type in ...

  2. 4.Android App 优化之消除卡顿

    转载:http://gold.xitu.io/post/582583328ac247004f3ab124 1, 感知卡顿 用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI ...

  3. 78. Android之 RxJava 详解

    转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...

  4. MapReduce实现数据去重

    一.原理分析 Mapreduce的处理过程,由于Mapreduce会在Map~reduce中,将重复的Key合并在一起,所以Mapreduce很容易就去除重复的行.Map无须做任何处理,设置Map中写 ...

  5. BZOJ1024 [SCOI2009]生日快乐

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  6. crawler: 常用的一些工具

    phantomjs, Headless的WebKit Driver,意味着可以无需GUI,完全模拟Chrome/Safari的操作. casperjs(基于phantomjs的好用封装),zombie ...

  7. 使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件

    景: 有一台主机,安装了windows7,在其安装了virtualbox,然后安装了ubuntu虚拟机.在windows7上安装SecureCRT来ssh连接ubuntu虚拟机.一般在windows上 ...

  8. SLF4J的好处

    原来我们使用log4j去打印日志,如果我们要更改日志记录器,比如用comms-Logging,那我们在代码里面还要改每个类的引用包,但是如果用slf4j的话只要在配置的时候改下,代码完全用slf4j的 ...

  9. TortoiseSVN 过滤文件(包括已提交和未提交)

    一:svn 设置过滤文件方式 1.选中需要过滤的文件夹或者文件---右键---TortoiseSVN---Add to Ignore list(如果不显示说明该目录已经被添加) 2.在当前工作区域 不 ...

  10. CSS3动画(性能篇)

    写在前面 高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量.功耗与流畅度. 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额 ...