Unity是什么?

unity是patterns&practices团队开发的一个轻量级、可扩展的依赖注入容器。

Unity特性

1、它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。

2、Unity允许将预先配置的对象注入到类中,实现了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(构造器注入),property setter injection(属性设置值注入)和method call injection(方法注入)。

3、支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。

4、可以通过配置文件进行准备和配置容器。

5、不会影响到类的定义(属性设置值注入和方法注入除外),这也是轻量级容器的一个体现。

6、支持自定义的容器扩展。

Unity实践

新建一个控制台程序,Nuget安装Unity

新建一个叫IFlyable 飞行能力的接口。

    /// <summary>
/// 飞行接口
/// </summary>
public interface IFlyable
{
void Fly();
}

一个飞禽类,并实现飞行的接口

    /// <summary>
/// 飞禽类
/// </summary>
public class Bird : IFlyable
{
public void Fly()
{
Console.WriteLine("会飞的鸟......");
}
}

在Main方法中,通过Unity容器实例化一个飞禽对象,并让它飞。

        static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>();
IFlyable bird = container.Resolve<IFlyable>();
bird.Fly();
Console.Read(); }

输出

如果多个实现类呢?

添加个飞机类,让其实现飞行接口

    /// <summary>
/// 飞机
/// </summary>
public class Plane : IFlyable
{
public void Fly()
{
Console.WriteLine("超音速飞行......");
}
}

main方法

        static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>();
container.RegisterType<IFlyable, Plane>();
IFlyable bird = container.Resolve<IFlyable>();
IFlyable plane = container.Resolve<IFlyable>();
bird.Fly();
plane.Fly();
Console.Read(); }

结果

Unity:在一个接口有多个实现的情况下,如果没有进行别名区分,会选择最后注入的实现。

加入别名

        static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
container.RegisterType<IFlyable, Bird>("bird");
container.RegisterType<IFlyable, Plane>("plane");
IFlyable bird = container.Resolve<IFlyable>("bird");
IFlyable plane = container.Resolve<IFlyable>("plane");
bird.Fly();
plane.Fly();
Console.Read(); }

结果

注意

当一个接口有多个实现类的时候,注入的时候需要通过别名进行区分。

构造函数注入

我们添加一个接口

    /// <summary>
/// 具有会叫能力的接口
/// </summary>
public interface ISayable
{
IFlyable Fly { set; get; }
void Say();
}

添加一个鹦鹉类,有飞行能力,并且会叫

    /// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{
public IFlyable Fly
{
get;
set;
}
public Parrot(IFlyable fly)
{
this.Fly = fly;
} public void Say()
{
Console.WriteLine("会叫....");
}
}

main方法中,注入

        static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
//注入
//构造函数中注入 鸟类对象
container.RegisterType<IFlyable, Bird>();
container.RegisterType<ISayable, Parrot>();
ISayable Parrot = container.Resolve<ISayable>();
Parrot.Fly.Fly();
Parrot.Say();
Console.Read(); }

结果

属性注入

    /// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{
[Dependency]
public IFlyable Fly
{
get;
set;
}
public void Say()
{
Console.WriteLine("会叫....");
}
}

通过在属性上面添加[Dependency]特性,即可注入。

Main方法与上面的相同。

结果同样。

初始化器注入

说是初始化器,其实就是一个方法。但是个特别的方法,这个方法需要添加特性[InjectionMethod]

    /// <summary>
/// 鹦鹉类
/// </summary>
public class Parrot : ISayable
{ public IFlyable Fly
{
get;
set;
}
[InjectionMethod]
public void Init(IFlyable fly)
{
this.Fly = fly;
}
public void Say()
{
Console.WriteLine("会叫....");
}
}

结果

[IOC]Unity使用的更多相关文章

  1. IOC : Unity 配置和使用

    原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...

  2. IOC Unity

    1. 依赖倒置原则和IOC2. IOC(Inversion of Control)的好处3. 介绍和使用Unity依赖倒置原则(DIP):上层和下层之间,依赖抽象,而不依赖细节IOC 控制反转,把上端 ...

  3. .Net Ioc Unity

    Unity 的接口IUnityContainer public interface IUnityContainer : IDisposable IUnityContainer RegisterType ...

  4. .net web api ioc unity usage

    1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...

  5. .Net IOC 之Unity

    .Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...

  6. IOC容器:Unity

    一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...

  7. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  8. 【Unity】微软的一款依赖注入组件

    前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...

  9. _appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml

    ASP.NET MVC3 系列教程 – Web Pages 1.0 I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart ...

随机推荐

  1. Perl 的面向对象编程

    转自 http://net.pku.edu.cn/~yhf/tutorial/perl/perl_13.html 拓展阅读 http://bbs.chinaunix.net/forum.php?mod ...

  2. css-文本超出后显示省略号

    1.如果是单行文本: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 2.如果是多行文本,将文本框高度设为文字行高的倍数 ...

  3. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  4. Matlab读入含有特殊分隔符的文件(textread)

    笔者在此基础上进行运行,修改得到以下内容,希望大家给与补充: textread 基本语法是: [A,B,C,…] = textread(filename,format) [A,B,C,…] = tex ...

  5. magento app/design/adminhtml/default/default/template/sales/order/view/info.phtml XSS Vul

    catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link: http://www.freebuf. ...

  6. Automated CMS category, version identification (CMS vulnerability detection)

    catalog . 引言 . 不同CMS版本标的文件路径调研 . Code Example 1. 引言 微软解决大量CVE补丁更新的检测时候,采取的思路不是根据MD5对单个漏洞文件(.dll..sys ...

  7. 数据结构作业——N个数中未出现的最小整数(想法题)

    Description 给出一串数字,这串数字由 n 个数 ai 组成,找出未出现在这串数字中的最小正整数 Input 输入第一行为一个正整数 n (1 <= n <= 1000) 第二行 ...

  8. DNS介绍

    DNS出现及演化 网络出现的早期 是使用IP地址通讯的,那时就几台主机通讯.但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和w ...

  9. mybatis的批量删除

    公司工程用的是Mybatis的example的类,自动生成了对数据库的操作,批量操作的今天用到了,两种方式,一种需要拓展它生成的类,另一种自带的. 批量删除的id是以集合List传递 id以List& ...

  10. 删除ibus之后导致系统设置进不了

    sudo apt-get instal ubuntu-desktop 快捷键调出sogou拼音,默认为"ctrl+,"