Unity 使用快速教程
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 使用快速教程的更多相关文章
- Python快速教程 尾声
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...
- 【Python大系】Python快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- Python快速教程目录(转)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...
- Python快速教程 尾声(转)
原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留 ...
- 发布《Linux工具快速教程》
发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...
- Python快速教程
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...
- 对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。
这里素材全是网上找的. 教程看这里: [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(九) 角色初始设定 一.模型设置: 1.首先设置模型的动作无限循环. 不设置的话 ...
随机推荐
- js window对象
BOM的核心对象是window,它表示浏览器的一个实例. 在浏览器中,window对象是(1)通过JavaScript访问浏览器窗口的一个接口 (2)ECMAScript规定的Global对象 1.全 ...
- 分享2个网址二维码API接口
分享2个网址二维码生成API接口,用它们只需要填写好网址就能自动生成二维码,分别来自与bshare和jiathis分享工具中,如您需要就把下面的二维码生成API接口复制到你需要地方. 说明:把url= ...
- Helpful Tool
Remote Connectivity Analyzer(Online) https://testconnectivity.microsoft.com/ https://technet.microso ...
- Java并发之工具类 ForkJoin 任务分解
Fork/Join框架的介绍 第一步分割任务.首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小. 第二步执行任务并合并结果.分割 ...
- 已知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 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- (转)Java 详解 JVM 工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚 ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
- (安装linux操作系统)
安装linux centos系统. 准备一张centos的镜像可以去官网下载. 准备VMware Workstation官网下载. 作为初学者一般都用虚拟机安装(VMwareWorkstation), ...
- 浅谈C++设计模式之抽象工厂(Abstract Factory)
抽象工厂(Abstract Factory)模式是为了提供一系列相关或相互依赖对象的接口.对象创建型模式的一种. 客户Client 抽象工厂接口AbstractFactory 抽象工厂的实现类Conc ...