Unity是微软在CodePlex上的一个开源项目,可用于依赖注入、控制反转,类似Spring,下面是使用示例:

1.先来定义几个接口、类

 namespace UnityTest
{
public interface IRun
{
void Run();
}
}

: IRun

 namespace UnityTest
{
public class Pet
{
public string Name { set; get; }
}
}

: Pet

 using System;

 namespace UnityTest
{
public class Cat : Pet, IRun
{
public void Run()
{
Console.WriteLine("A cat is runing...");
}
}
}

: Cat

 using System;

 namespace UnityTest
{
public class Dog : Pet, IRun
{
public void Run()
{
Console.WriteLine("A dog is runing...");
}
}
}

: Dog

 namespace UnityTest.Model
{
public class Person
{
IRun iRun; public Person(IRun iRun)
{
this.iRun = iRun;
} public void HiWeGo()
{
iRun.Run();
}
}
}

:Person

2、创建对象实例

 using System;
using System.Web.Script.Serialization;
using Microsoft.Practices.Unity; namespace UnityTest
{
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<IRun, Dog>(); //注册类型,并将IRun映射到Dog
var dog1 = container.Resolve<IRun>(); //创建一个IRun实例,实际上就是Dog
(dog1 as Dog).Name = "buddy";
Console.WriteLine("a dog is born,his name is \"{0}\"", (dog1 as Dog).Name); //a dog is born,his name is "buddy"
Console.Read();
}
}
}

3、使用标识符

当IRun同时有多个实例类要注入时,如果没有标识来区别,创建出来的实例“类型”就没办法显示指定。

             var container = new UnityContainer();
container.RegisterType<IRun, Dog>()
.RegisterType<IRun, Cat>();
var run = container.Resolve<IRun>();//这里的run实例,是cat,还是dog ?
Console.Write(run.ToString());//UnityTest.Cat
             var container = new UnityContainer();
container.RegisterType<IRun, Dog>("dogType")
.RegisterType<IRun, Cat>("catType");
var run = container.Resolve<IRun>("dogType");//明确指示,我要一个dog
Console.Write(run.ToString());//UnityTest.Dog

4、创建单例

             var container = new UnityContainer();
container.RegisterType<IRun, Dog>("dogTypeSingle", new ContainerControlledLifetimeManager())//dogTypeSingle为单例模式
.RegisterType<IRun, Dog>("dogType"); var dog1 = container.Resolve<IRun>("dogTypeSingle");
var dog2 = container.Resolve<IRun>("dogTypeSingle"); Console.WriteLine(object.ReferenceEquals(dog1, dog2));//True
Console.WriteLine(dog1.GetHashCode() == dog2.GetHashCode());//True 说明dog1与dog2是同一个对象 var dog3 = container.Resolve<IRun>("dogType");
var dog4 = container.Resolve<IRun>("dogType");
Console.WriteLine(object.ReferenceEquals(dog3, dog4));//False
Console.WriteLine(dog3.GetHashCode() == dog4.GetHashCode());//False 说明dog3与dog4是不同的对象

:Singleton

5、依赖注入

构造器自动注入

             var container = new UnityContainer();
container.RegisterType<IRun, Dog>();
var personWithDog = container.Resolve<Person>();
personWithDog.HiWeGo();//A dog is runing...

构造器也可以结合标识符显示注入

             var container = new UnityContainer();
container.RegisterType<IRun, Dog>("dog")
.RegisterType<IRun, Cat>("cat")
.RegisterType<Person, Person>("PersonWithDog", new InjectionConstructor(container.Resolve<IRun>("dog")))
.RegisterType<Person, Person>("PersonWithCat", new InjectionConstructor(container.Resolve<IRun>("cat"))); var personWithDog = container.Resolve<Person>("PersonWithDog");
personWithDog.HiWeGo();//A dog is runing...
var personWithCat = container.Resolve<Person>("PersonWithCat");
personWithCat.HiWeGo();//A cat is runing...
Console.Read();

使用InjectionConstructor特性注入

为了演示[InjectionConstructor]特性,先改造一下Person类

 using System.Collections.Generic;
using Microsoft.Practices.Unity;
namespace UnityTest
{
public class Person
{
private List<IRun> pets; public Person()
{
pets = new List<IRun>();
} [InjectionConstructor]
public Person(IRun iRun):this()
{
pets.Add(iRun);
} public Person(IRun iRun1,IRun iRun2):this()
{
pets.Add(iRun1);
pets.Add(iRun2);
} public void HiWeGo()
{
foreach (var pet in pets)
{
pet.Run();
}
}
}
}

测试一下:

             var container = new UnityContainer();

             container.RegisterType<IRun, Dog>("dog") //注册一个带标识的dog类型
.RegisterType<IRun, Cat>("cat") //注册一个带标识的cat类型
.RegisterType<IRun, Dog>() //不指定标识,即默认IRun的实例为dog
.RegisterType<Person, Person>("PersonWithDogAndCat",
new InjectionConstructor(
container.Resolve<IRun>("dog"),
container.Resolve<IRun>("cat")
)//显示将二个参数的构造方法注册到容器中
); var person = container.Resolve<Person>();//自动调用有InjectionConstructor标记的构造方法
person.HiWeGo();//A dog is runing... Console.WriteLine("---------------"); var personWithDogAndCat = container.Resolve<Person>("PersonWithDogAndCat");//显式调用在容器中注册过的构造方法
personWithDogAndCat.HiWeGo();
//A dog is runing...
//A cat is runing... Console.Read();

未完待续...

Unity 使用快速教程的更多相关文章

  1. Python快速教程 尾声

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...

  2. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  3. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  4. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  5. Python快速教程目录(转)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...

  6. Python快速教程 尾声(转)

    原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留 ...

  7. 发布《Linux工具快速教程》

    发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...

  8. Python快速教程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...

  9. 对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。

    这里素材全是网上找的. 教程看这里: [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(九) 角色初始设定 一.模型设置: 1.首先设置模型的动作无限循环. 不设置的话 ...

随机推荐

  1. js window对象

    BOM的核心对象是window,它表示浏览器的一个实例. 在浏览器中,window对象是(1)通过JavaScript访问浏览器窗口的一个接口 (2)ECMAScript规定的Global对象 1.全 ...

  2. 分享2个网址二维码API接口

    分享2个网址二维码生成API接口,用它们只需要填写好网址就能自动生成二维码,分别来自与bshare和jiathis分享工具中,如您需要就把下面的二维码生成API接口复制到你需要地方. 说明:把url= ...

  3. Helpful Tool

    Remote Connectivity Analyzer(Online) https://testconnectivity.microsoft.com/ https://technet.microso ...

  4. Java并发之工具类 ForkJoin 任务分解

    Fork/Join框架的介绍 第一步分割任务.首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小. 第二步执行任务并合并结果.分割 ...

  5. 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b ,对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。

    int[]a={3,4,5,6,7}; int[]b={1,2,3,4,5,6,7}; int[] arry=new int[7]; System.out.print("数组b[]={&qu ...

  6. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  7. (转)Java 详解 JVM 工作原理和流程

    作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚 ...

  8. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  9. (安装linux操作系统)

    安装linux centos系统. 准备一张centos的镜像可以去官网下载. 准备VMware Workstation官网下载. 作为初学者一般都用虚拟机安装(VMwareWorkstation), ...

  10. 浅谈C++设计模式之抽象工厂(Abstract Factory)

    抽象工厂(Abstract Factory)模式是为了提供一系列相关或相互依赖对象的接口.对象创建型模式的一种. 客户Client 抽象工厂接口AbstractFactory 抽象工厂的实现类Conc ...