Unity 使用快速教程

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

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

1 namespace UnityTest
2 {
3     public interface IRun
4     {
5         void Run();
6     }
7 }

View Code : IRun

1 namespace UnityTest
2 {
3     public class Pet
4     {
5         public string Name { set; get; }
6     }
7 }

View Code : Pet

 1 using System;
 2
 3 namespace UnityTest
 4 {
 5     public class Cat : Pet, IRun
 6     {
 7         public void Run()
 8         {
 9             Console.WriteLine("A cat is runing...");
10         }
11     }
12 }

View Code : Cat

 1 using System;
 2
 3 namespace UnityTest
 4 {
 5     public class Dog : Pet, IRun
 6     {
 7         public void Run()
 8         {
 9             Console.WriteLine("A dog is runing...");
10         }
11     }
12 }

View Code : Dog

 1 namespace UnityTest.Model
 2 {
 3     public class Person
 4     {
 5         IRun iRun;
 6
 7         public Person(IRun iRun)
 8         {
 9             this.iRun = iRun;
10         }
11
12         public void HiWeGo()
13         {
14             iRun.Run();
15         }
16     }
17 }

View Code :Person

 2、创建对象实例

 1 using System;
 2 using System.Web.Script.Serialization;
 3 using Microsoft.Practices.Unity;
 4
 5 namespace UnityTest
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             var container = new UnityContainer();
12             container.RegisterType<IRun, Dog>(); //注册类型,并将IRun映射到Dog
13             var dog1 = container.Resolve<IRun>(); //创建一个IRun实例,实际上就是Dog
14             (dog1 as Dog).Name = "buddy";
15             Console.WriteLine("a dog is born,his name is \"{0}\"", (dog1 as Dog).Name); //a dog is born,his name is "buddy"
16             Console.Read();
17         }
18     }
19 }

View Code

 3、使用标识符

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

1             var container = new UnityContainer();
2             container.RegisterType<IRun, Dog>()
3                     .RegisterType<IRun, Cat>();
4             var run = container.Resolve<IRun>();//这里的run实例,是cat,还是dog ?
5             Console.Write(run.ToString());//UnityTest.Cat

View Code

1             var container = new UnityContainer();
2             container.RegisterType<IRun, Dog>("dogType")
3                     .RegisterType<IRun, Cat>("catType");
4             var run = container.Resolve<IRun>("dogType");//明确指示,我要一个dog
5             Console.Write(run.ToString());//UnityTest.Dog

View Code

 4、创建单例

 1             var container = new UnityContainer();
 2             container.RegisterType<IRun, Dog>("dogTypeSingle", new ContainerControlledLifetimeManager())//dogTypeSingle为单例模式
 3                     .RegisterType<IRun, Dog>("dogType");
 4
 5             var dog1 = container.Resolve<IRun>("dogTypeSingle");
 6             var dog2 = container.Resolve<IRun>("dogTypeSingle");
 7
 8             Console.WriteLine(object.ReferenceEquals(dog1, dog2));//True
 9             Console.WriteLine(dog1.GetHashCode() == dog2.GetHashCode());//True 说明dog1与dog2是同一个对象
10
11             var dog3 = container.Resolve<IRun>("dogType");
12             var dog4 = container.Resolve<IRun>("dogType");
13             Console.WriteLine(object.ReferenceEquals(dog3, dog4));//False
14             Console.WriteLine(dog3.GetHashCode() == dog4.GetHashCode());//False 说明dog3与dog4是不同的对象

View Code :Singleton

 5、依赖注入

构造器自动注入

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

View Code

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

 1             var container = new UnityContainer();
 2             container.RegisterType<IRun, Dog>("dog")
 3                 .RegisterType<IRun, Cat>("cat")
 4                 .RegisterType<Person, Person>("PersonWithDog", new InjectionConstructor(container.Resolve<IRun>("dog")))
 5                 .RegisterType<Person, Person>("PersonWithCat", new InjectionConstructor(container.Resolve<IRun>("cat")));
 6
 7             var personWithDog = container.Resolve<Person>("PersonWithDog");
 8             personWithDog.HiWeGo();//A dog is runing...
 9             var personWithCat = container.Resolve<Person>("PersonWithCat");
10             personWithCat.HiWeGo();//A cat is runing...
11             Console.Read();

View Code

 使用InjectionConstructor特性注入

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

 1 using System.Collections.Generic;
 2 using Microsoft.Practices.Unity;
 3 namespace UnityTest
 4 {
 5     public class Person
 6     {
 7         private List<IRun> pets;
 8
 9         public Person()
10         {
11             pets = new List<IRun>();
12         }
13
14         [InjectionConstructor]
15         public Person(IRun iRun):this()
16         {
17             pets.Add(iRun);
18         }
19
20         public Person(IRun iRun1,IRun iRun2):this()
21         {
22             pets.Add(iRun1);
23             pets.Add(iRun2);
24         }
25
26
27         public void HiWeGo()
28         {
29             foreach (var pet in pets)
30             {
31                 pet.Run();
32             }
33         }
34     }
35 }

View Code

测试一下:

 1             var container = new UnityContainer();
 2
 3             container.RegisterType<IRun, Dog>("dog") //注册一个带标识的dog类型
 4                 .RegisterType<IRun, Cat>("cat") //注册一个带标识的cat类型
 5                 .RegisterType<IRun, Dog>() //不指定标识,即默认IRun的实例为dog
 6                 .RegisterType<Person, Person>("PersonWithDogAndCat",
 7                     new InjectionConstructor(
 8                         container.Resolve<IRun>("dog"),
 9                         container.Resolve<IRun>("cat")
10                     )//显示将二个参数的构造方法注册到容器中
11                 );
12
13
14             var person = container.Resolve<Person>();//自动调用有InjectionConstructor标记的构造方法
15             person.HiWeGo();//A dog is runing...
16
17
18             Console.WriteLine("---------------");
19
20             var personWithDogAndCat = container.Resolve<Person>("PersonWithDogAndCat");//显式调用在容器中注册过的构造方法
21             personWithDogAndCat.HiWeGo();
22             //A dog is runing...
23             //A cat is runing...
24
25             Console.Read();

View Code

 未完待续...

时间: 2024-10-25 08:14:46

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

Python快速教程 尾声

  写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基础.标准库.Django框架.前前后后的文章,包含了Python最重要的组成部分.这一内容的跨度远远超过我的预期,也超过了我看过的任何Python相关书籍.最初动笔的原因,除了要总结,还对很多Python书和教程觉得不满意,觉得太晦涩,又不够全面.现在,我比较确定,参考我在Linux.网络.算法方面的总结,读者可以在无基础的背景下,在短时间,有深度的学习Python了. 这一篇也是尾声.准备在一个长的时间内,停

Python快速教程

原文:Python快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库,拓展库,乱花渐欲迷人眼.一直希望写一个快速的.容易上手的Python教程.目标是做到言语简洁,循序渐进,让没有背景的读者也可以从基础开始学习.我在每一篇中专注于一个小的概念,希望在闲暇时可以很快读完. 小提醒 教程将专注于Python基础,语法基

《树莓派开发实战(第2版)》——第2章 Figaro快速教程

第2章 Figaro快速教程 概率编程实战本章介绍如下内容: 模型创建.证据陈述.推理运行和查询的回答理解模型基本构件从这些构件构造复杂模型现在,您已经了解了概率编程的含义,可以详细了解Figaro,以便编写自己的简单程序,用它们回答查询.本章的目标是尽快介绍Figaro的最重要概念.后面的章节详细解释模型的含义以及对它们的理解.让我们开始吧.

JavaScript正则快速教程(待续,不断更新补充)

一.简介 正则全称正则表达式,通常叫正则就可以了,英文叫 Regular Expression,简称 RegExp.至于为什么叫"正则表达式",是不是有点怪怪的?--既然说是"正"了,哪里又是"反的",--这里就不学究了,本文是快速教程,学懂再说,不必纠泥学术的名称. 总之,正则很有用的,先学会! 二.Hello World 不能免俗,还是要祭出 Hello World. alert(/hello/.test('hello world')); /

[Unity3D]Unity+Android交互教程——让手机&quot;动&quot;起来

想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是没反应,没办法看源码,结果发现只实现了IOS部分,没有Android部分,我屮艸芔茻...,神伤!用IOS真机测试吧,还是有问题,果断放弃了,下定决心自己动手丰衣足食,虽然不了解Android,但没有学不起来的,只要想,就没有实现不了的!!!首先还是得学习一下Android和Unity的简单交互,在

Fireworks图像优化快速教程

教程|优化 最近我们在设计比赛中,通常会有一些缩略图需要提交,但往往有一部分设计师不能达到我们设定的需求,为了解决这个问题,我特意写了这篇优化的文章.告诉大家一些基本的方法.如果立志做一个网络设计师,那么图形优化会是一门基本功,我建议查看在线帮助的图形优化一节,里面有更详细的内容说明原理. 进行网络图形设计的最终目标就是,设计制作出下载十分迅速的优美图像来.为了能够做到这一点,你在设计制作的过程当中必须要尽可能地减少应用的颜色数目,然后为你的图像选择一种具有最佳压缩比的文件格式,同时最大程度地保

Java快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!      Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和

Python快速教程 (手册)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   说明 1. 教程将专注于Python基础,语法基于Python 2.7 (我会提醒Python 3.x中有变化的地方,以方便读者适应3.X的情况).测试环境为Linux, 将不会使用到标准库之外的模块. 2. 我将专注于python的主干,以便读者能以最快时间对python形成概念. 3. Linux命令行将以 $ 开始,比如 $ls, $python 4. python命令

Python小题目 针对快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   作业的目的是帮助熟悉之前学习的内容:    1. 写一个程序,判断2008年是否是闰年. 写一个程序,用于计算2008年10月1日是这一年的第几天?(2008年1月1日是这一年的第一天) 这些小题目是为了方便大家加深对Python理解而设计的.   2. 有一个record.txt的文档,内容如下: # name, age, score tom, 12, 86 Lee, 15