读者约定:

Unity我直接简写U了


Unity Dependency Injection(DI)

欢迎学习Unity,通过学完下面的几个流程的引导,你应该就可以很顺利的应用Unity到你的项目中去了:

  1. Unity是什么
  2. Unity 能做什么
  3. 什么时候使用Unity
  4. Unity的Release版本的介绍
  5. 配置Unity
  6. 在项目中使用Unity
  7. Unity的设计
  8. 拓展和修改Unity
  9. 部署和操作
  10. Unity QuickStarts项目(这个教程都是在制作QuickStarts项目,给你讲解Unity,应用程序中最常见的操作)

1.Unity是什么?

一个轻量级,可拓展的DI容器:支持

  • interception(拦截)
  • constructor injection,(构造器注入)
  • property injection(属性注入)
  • method call injection(方法调用注入)

可以帮你降低项目中模块之间的耦合性,算了。。就是一句话,让你的项目高内聚,低耦合,简化实现的设计,简化测试,简化项目管理,原文

(You can use Unity in a variety of different ways to help decouple the components of your applications, to maximize coherence in
components, and to simplify design, implementation, testing, and administration of these applications)

对于基于微软.net framework的程序Unity都是通用的。它提供了很多注入机制,包括 注册类型映射,对象实例的方法,Resolve对象,管理对象生命周期,可以在构造函数,方法注入,这样就可以解决对象属性赋值的问题

此外,Unity可拓展,你可以拓展来改变容器的行为,或者添加一个新功能,比如说unity的”拦截“特色(就是被拓展实现的,通过给对象添加一个策略完成的)。

下面几个先大致缩略介绍一下:

  1. Unity 能做什么 
            能帮助你理解Unity能干什么,它拥有的一些概念和特点,也提供一个使用Unity写的简短的例子
  2. 什么时候使用Unity
           通过了解,你可以知道Unity是否满足你的需要,介绍了Unity的优点,同时也提供了几个其他的技术方案给你考虑.但也介绍了Unity的局限性,这个可能会影响你的决定是否使用Untiy.
  3. Unity的Release版本的介绍
           讲了一下 ,这次版本的变化,因为有的人使用老版本,所以说了一些迁移注意事项和方法
  4. 配置Unity
           本章讲解:如何使用类型注册,映射,扩展,还有其他的需要的来填充容器。
  5. 在项目中使用Unity
           感觉重点了,教你在你的项目中如何使用Unity,向项目中添加Unity,怎样Resolve对象,怎样使用Unity的其他功能
  6. Unity的设计
           讲了一下 ,Unity背后的设计和依据
  7. 拓展和修改Unity
           讲了一下 ,如何拓展Unity,如何修改Unity
  8. 部署和操作
           讲了一下 ,如何部署和升级Unity程序集,如何使用Unity暴露的仪器

2.Unity能做什么?

通过DI和控制反转的机制,你可以生成和装配自定义类的实例,独立对象实例和设置。以下几点你可以使用的Unity提供的特点:

------------------------------------------------------------------------------------------------------------------------------------------------

  • Unity可以创建的对象的类型 (The Types of Objects Unity Can Create)
  • 注册已经存在的类型和对象的实例(Registering Existing Types and Object Instances)
  • 管理对象生命周期(Managing the Lifetime of Objects)
  • 指定值用于注入(Specifying Values for Injection)
  • 填充和注入数组,包括泛型数组(Populating and Injecting Arrays, Including Generic Arrays)
  • 拦截对象的调用(Intercepting Calls to Objects)

------------------------------------------------------------------------------------------------------------------------------------------------

2.1  Unity可以创建的对象的类型

在没有注册注册容器类型映射的前提下,你可以使用Unity产生任何拥有public构造函数的(换句话说就是,可以使用new操作符创建的对象)对象。当你调用了Resolve方法并指定了一个未注册的类型实例作为参数,容器只是简单地调用了构造函数并返回一个结果给你。

Unity暴露了一个RegisterType方法(注册类型和映射的容器)。也提供了一个Resolve方法(让容器为你指定的类型生成一个指定类型的对象)。Resolve方法创建的对象的生命周期等同于你在方法中指定的参数一样。如果你不指定参数,容器每次调用Resolve都会创建一个新的实例。(如果你知道设计模式中的单例模式,应该就很容易理解什么意思了),更多信息请查看 Registering Types and Type Mappings(暂时还没写)

2.2注册已经存在的类型和对象的实例

Unity暴露了一个RegisterInstance的方法,你可以在容器中注册一个已经存在的类型了。当你调用Resolve方法时候,容器在生命周期内就会返回那个已经存在的实例。如果你没有为生命周期指定一个值,那么它的实例就会有个容器控制的声明周期,这就意味着它是一个单例了。更多信息请查看Creating Instance Registrations(暂时还没写)

2.3管理对象声明周期

Unity允许你选择它创建的对象的生命周期。默认情况下,你Resolve一下,就会创建一个新的对象。但是,你可以在Resolve实例的时候,可以使用生命周期管理者去指定一个不一样的生命周期。举个例子,你可以让Unity为你维护一个单例(如果没有对象,就会创建一个对象,如果存在对象,那就返回那个对象,这就是单例)。当然还有其他的生命周期管理方式。举个例子,你可以使用生命周期管理者去维护对象弱引用,是为了创建对象后使用你也可以随时去释放它,有时候单例的时候可能被多个线程同时使用,使用Unity可以保证每一个分开的线程都可以使用同一个单例(对象)。(真心看不懂最后一句话,如果不懂,你可以看看单例模式~)

原文:

For example, you can use a lifetime manager that holds only a weak reference to objects so that the creating process can dispose them, or a lifetime manager that maintains a separate single instance of an object on each separate thread that resolves it.

当你注册一个类型,类型映射,他们的生命周期可以由你控制生命周期管理器管理,还有,你在设计时就可以对已经存在的对象进行配置。可以参考 Specifying Types in the Configuration File   或者还有个选择,可以在运行时候向容器注册,然后指定生命周期方式。可以参考Registering Types and Type Mappings 或者 Creating Instance Registrations

2.4 为构造函数,方法和属性 的注入 配置类型

Unity允许你使用 构造器注入,方法注入,属性注入的方式 生成和装配完成所有依赖对象的实例和设置。更多信息:Specifying Values for Injection

和 Registering Injected Parameter and Property Values

2.4.1 构造函数注入的例子
下面是个构造函数注入的例子。如果在Unity容器中,有个类定义了一个或者多个依赖于其他类的构造函数,当你使用Resolve初始化的时候,Untiy会自动创建一个依赖对象实例,并向它的构造函数中赋值那个对象。看下面的代码,演示了一个名叫CustomerService的类中有一个依赖类叫LoggingService

public class CustomerService
{
public CustomerService(LoggingService myServiceInstance)
{
// work with the dependent instance
myServiceInstance.WriteToLog("SomeValue");
}

运行时候, 开发者可以通过Resolve方法创建CustomerService实例,这种方式,同时也会在CustomerServic作用域中创建一个LoggingService实例,就相当于注入了一个实体类(Concrete class)LoggingService的实例

IUnityContainer uContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();

2.4.2 属性注入的例子

除了构造函数注入,更早一点,Untiy还支持属性注入和方法调用注入,下面有个例子。

ProductService类引用了SupplierData(下面代码没定义)类,也就是依赖它了。Unity不会自动设置去创建一个实例的,你必须明确地配置容器。一种是使用Dependency特性,如下:

public class ProductService
{
private SupplierData supplier;
[Dependency]
public SupplierData SupplierDetails
{
get { return supplier; }
set { supplier = value; }
}
}

现在你通过Unity来创建ProductService实例的时候,就会自动创建一个SupplierData 实例,并给这个属性赋值,换句话说,SupplierDetails对象不是空的了,本来我们使用SupplierDetails,肯定是空的,使用起来就会报错,但是如果加上Dependency特性,就不会报错了。

2.4.3 填充和注入数组, 泛型数组

你可以定义数组,泛型数组,代码运行的时候,Unity就会自动给数组赋值(注入数据),让它不是空的了。你可以指定数组的成员,或者使用Unity将配置中所定义的匹配类型自动填充到数组中。接着你就可以直接使用这个数组了。然后你可以直接使用数组作为类型填充,或者设置成构造函数的值、方法的参数成员和属性。数组可以被定义在配置文件中或通过代码在运行时定义。

更多的信息参考:

    • 配置注入参数和属性值 (Configuring Injected Parameter and Property Values)
    • 注册注入参数和属性值 (Registering Injected Parameter and Property Values )
    • 注册泛型参数和类型 (Registering Generic Parameters and Types )

2.5 拦截(Interception)对象的调用

在面向对象的系统中,对象的职责是单一的 那是最好的。随着系统的开发,很多需求就会增加。比如系统的监视相关的:日志,时间计数器,参数验证和异常处理。横向切割(AOP)可以解决有些情况下代码重复的问题。代码重复带来的问题,比如说,如果一处发生改变,那么你就要改很多地方,所以比较麻烦。

拦截技术(Interception)使你能够在调用目标对象之前或之后增加代码,举个例子,调用方法之前,判断用户是否有权限,有权限就调用呗。

当你手动执行此编码过程,接下来你会知道什么被称之为装饰模式。编写装饰模式需求需要在设计开始知道类型的问题,同時要求每一个不同的装饰类型配合你所写的类型。

[AaronYang风格]微软Unity2.X系统学习笔记,记录的更多相关文章

  1. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  2. Dubbo -- 系统学习 笔记 -- 快速启动

    Dubbo -- 系统学习 笔记 -- 目录 快速启动 服务提供者 服务消费者 快速启动 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubb ...

  3. Dubbo -- 系统学习 笔记 -- 配置

    Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...

  4. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  5. Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 结果缓存 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用 ...

  6. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...

  7. Dubbo -- 系统学习 笔记 -- 示例 -- 多版本

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多版本 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...

  9. Dubbo -- 系统学习 笔记 -- 示例 -- 多注册中心

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多注册中心 可以自行扩展注册中心,参见:注册中心扩展 (1) 多注册中心注册 比如 ...

随机推荐

  1. Android Handler 消息处理使用

    本文内容 环境 演示 Handler 消息处理 参考资料 Handler 有两个主要作用或者说是步骤:发送消息和处理消息.在新启动的线程中发送消息,在主线程中获取.并处理消息.Android 平台只允 ...

  2. android中RecyclerView控件实现长按弹出PopupMenu菜单功能

    之前写过一篇文章:android中实现简单的聊天功能 现在是在之前功能的基础上,添加一个长按聊天记录,删除对应聊天记录的功能 RecyclerView控件,没有对应的长按事件,我们需要自己手工添加,修 ...

  3. 【转】使用 Android 的日志工具LogCat

    Android中的日志工具类是 Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志. 1.    Log.v() 这个方法用于打印那些最为琐碎的,意义最小的日志信息 ...

  4. Python小任务 - 如何编写指定时间执行的Python小程序

    我们在平时的工作中经常会遇到这样的需求,需要再某个时间点执行一段程序逻辑. 那么,在python中我们是怎么做的呢? 下面看代码: waitDesignatedTimeToRun.py import ...

  5. jQuery开发技巧

    jQuery 事件 - submit() 方法 $("form").submit(function(e){}); 当提交表单时,会发生 submit 事件. 该事件只适用于表单元素 ...

  6. JQuery 之 在数据加载完成后才自动执行函数

    数据加载完成执行: $(window).load(function(){ ... }); 进入页就执行,不论等数据是否加载完成: $(document).ready(function(){ ... } ...

  7. 【shell】shell基础脚本合集

    1.向脚本传递参数 #!/bin/bash #功能:打印文件名与输入参数 #作者:OLIVER echo $0 #打印文件名 echo $1 #打印输入参数 执行结果: 2.在脚本中使用参数 #!/b ...

  8. python之函数用法isupper()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法isupper() #http://www.runoob.com/python/att ...

  9. Arduino通过I2C(SSD1306)驱动0.96寸12864OLED

    I2C驱动的128x64 OLED I2C (Inter-Integrated Circuit) 集成电路总线是I2CBus的简称, 是一种串行通信总线, 使用多主从架构. 飞利浦公司在1980年代为 ...

  10. ArcGIS空间参考概述

    摘要:在地理数据库中,坐标系和其他相关空间属性被定义为各数据集的空间参考的一部分.空间参考是用于存储各要素类和栅格数据集,以及其他坐标属性(例如,x,y 坐标的坐标分辨率及可选的 z 坐标和测量 (m ...