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.首先设置模型的动作无限循环. 不设置的话 ...
随机推荐
- CMMI能搭救企业吗?
曾经有朋友跟我提起,他们公司突然有人关注我了,我自然很开心了,看来我名声在外了,哈哈!但我的朋友说,他是这样关注的:“他怎么还在那个公司?他们不是过了5级了吗?我们公司过了级后,EPG(Enginee ...
- == 与 equals 区别
同: ==和equals都比较两个值是否相等.相等为true 否则为false: 异: 1. == 是一个运算符;equals则是string对象的方法,可以.(点)出来. ...
- ThreadLocal源码分析
1.概述 ThreadLocal,可以理解为线程的局部变量,作用就是为每一个使用该变量的线程都提供一个变量值的副本,每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. ThreadLo ...
- 持续集成(CI)初探
前不久接触了持续集成(Continuous Integration,CI). 一.持续集成是什么 首先说说“集成”的概念.在实际的软件开发中,常常会发生两种情境: 1.几个项目组对同一个系统的不同功能 ...
- 旧项目如何切换到Entity Framework Code First
Entity Framework Code First固然是好东西,然而如果是已经存在的旧有项目,如何简单方便的使用切换呢? 这里介绍一个VS的插件Entity Framework Power Too ...
- ORACLE口令管理
口令文件介绍 在ORALCE数据库系统中,用户如果要以特权用户身份(SYS/SYSDBA/SYSOPER)登录ORALCE数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用ORALC ...
- Mongodb Manual阅读笔记:CH8 复制集
8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- Java触发器CronTrigger
摘要:如果需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用. 一.web.xml: < ...
- maven-shade-plugin
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- PostgreSQL模仿Oracle的instr函数
-- -- instr functions that mimic Oracle's counterpart -- Syntax: instr(string1, string2, [n], [m]) w ...