Unity 使用快速教程
时间:2022-04-23
本文章向大家介绍Unity 使用快速教程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Unity是微软在CodePlex上的一个开源项目,可用于依赖注入、控制反转,类似Spring,下面是使用示例:
1.先来定义几个接口、类
1 namespace UnityTest
2 {
3 public interface IRun
4 {
5 void Run();
6 }
7 }
1 namespace UnityTest
2 {
3 public class Pet
4 {
5 public string Name { set; get; }
6 }
7 }
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 }
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 }
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 }
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 }
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
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
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是不同的对象
5、依赖注入
构造器自动注入
1 var container = new UnityContainer();
2 container.RegisterType<IRun, Dog>();
3 var personWithDog = container.Resolve<Person>();
4 personWithDog.HiWeGo();//A dog is runing...
构造器也可以结合标识符显示注入
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();
使用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 }
测试一下:
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();
未完待续...
- 后缀数组(一堆干货)
- POJ 1741 Tree(树的点分治,入门题)
- hihoCoder 1039:字符消除(字符串处理)
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
- hihoCoder 1051 补提交卡(贪心,枚举)
- LCA 最近公共祖先
- RMQ问题(线段树算法,ST算法优化)
- 统计0到n之间1的个数[数学,动态规划dp](经典,详解)
- Selenium2+python自动化40-cookie相关操作
- 【干货】PyTorch实例:用ResNet进行交通标志分类
- 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
- Selenium2+python自动化41-绕过验证码(add_cookie)
- C语言求最小公倍数和最大公约数三种算法(经典)
- Selenium2+python自动化47-判断弹出框存在(alert_is_present)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- freeswitch笔记(9)-esl outbound中如何放音采集按键?
- react childern添加事件
- Spring事务的传播行为案例分析
- ThreadLocal与Java引用类型(文末含福利)
- GitLab 12 跨版本 13 升级
- 打破你的认知!Java空指针居然还能这样玩,90%人不知道…
- Android 原生 SQLite 数据库的一次封装实践
- Window常用账号密码修改(Git)
- 高通AI研究院|高效网络设计|结构化卷积分解
- tomcat调优 tomcat配置优化
- error: PyThreadState {aka struct _ts} has no member named exc_type
- Python创建目录文件夹
- python 按顺序读文件夹下面的文件
- python剪切文件
- 一个hashCode问题的追问,差点让我陷入无底洞