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. 编译hadoop2.6.0

    具体情况比较曲折:hadoop2.6.0编译不过 错误如下: 这个kms模块始终编译不过,最后得出结论国内的aliyun maven仓库有问题, 在编译hadoop2.2.0 可以通过,因为这个版本的 ...

  2. [Linux 存储管理] LVM结构

    linux的LVM灵活且功能强大,当然越强大的就越难理解.lvm和硬盘大致关系应该如下,如果有误请大家左证. lvm中快照功能强大到,很多db的备份都依赖于这个功能,所以不能不理解和熟悉. <鸟 ...

  3. 0022 Java学习笔记-面向对象-继承、多态、组合

    继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...

  4. Rollback 语句 在08R2版本

    有时候为了数据完整我们会启用到事务.正常的时候一帆风顺,如果rollback 呢? 最简单的一个回滚 IF OBJECT_ID('PROC1') IS NOT NULL     DROP PROCED ...

  5. Servlet/JSP-03 HttpServlet

    一. GenericServlet GenericServlet本身是一个抽象类,并且实现了Servlet和ServletConfig接口 其在内部定义了一个私有的ServletConfig类型的变量 ...

  6. spark mllib配置pom.xml错误 Multiple markers at this line Could not transfer artifact net.sf.opencsv:opencsv:jar:2.3 from/to central (https://repo.maven.apache.org/maven2): repo.maven.apache.org

    刚刚spark mllib,在maven repository网站http://mvnrepository.com/中查询mllib后得到相关库的最新dependence为: <dependen ...

  7. Linux命令总结【待续】

    1.打包:  tar -czf small.tar.gz small(目录名)  ;压缩并打包目录 2.解包: tar zxvf 文件名 date -s 2015 2 12 修改时间 cp name ...

  8. 移动Windows用户文件夹的方法研究

    这种方法可能导致升级Windows失败.请谨慎使用. Windows 8.1 使用有效.其他系统请酌情修改. —————————————————————————— 复制文件内容(带权限等信息):有的说 ...

  9. linux线程同步(5)-屏障

    一.概述                                                    barrier(屏障)与互斥量,读写锁,自旋锁不同,它不是用来保护临界区的.相反,它跟条 ...

  10. MySQL版本介绍

    MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本,开源免费, ...