通过Unity容器的BuildUp方法可以让已存在的对象实例也可以支持依赖注入。

准备工作

先看一些类,下面会用到:

public class Owner
{
    public string Name
    {
        get
        {
            return "Inrie";
        }
    }

public int Age
    {
        get
        {
            return 24;
        }
    }
}

public abstract class Player
{
    public abstract void Play();

public abstract string Name{get;}

[Dependency]
    public Owner Owner { get; set; }
}

public class Mp3Player : Player
{
    public override void Play()
    {
        Console.WriteLine("Playing Mp3");
    }

public override string Name
    {
        get
        {
            return "Mp3 Player";
        }
    }
}

public class CDPlayer : Player
{
    public override void Play()
    {
        Console.WriteLine("Playing CD");
    }

public override string Name
    {
        get
        {
            return "CD Player";
        }
    }
}

public class DVDPlayer : Player
{
    public override void Play()
    {
        Console.WriteLine("Playing DVD");
    }

public override string Name
    {
        get
        {
            return "DVD Player";
        }
    }
}

开始

考虑下面的情况:

在系统的某个组件或类库中有个方法,该方法返回一个对象实例。

public class CoreLib
{
    public Player CreatePlayer()
    {
        return new Mp3Player();
    }
}

在程序中这样来调用此方法,获取对象实例,并输出该播放器拥有者名字

CoreLib coreLib = new CoreLib();
Player player = coreLib.CreatePlayer();

Console.WriteLine(player.Owner.Name);

显而易见,这里肯定会报错,因为player对象的Owner属性依赖于Owner类,而这里在还没实例化该类时就想调用它的Name属性,会出现“未将对象引用设置到对象的实例”的错误。

大家应该可以马上想到,这正是属性注入出现的时候了。

这里为Player类的Owner属性加上[Dependency]标签(Attribute)。

[Dependency]
public Owner Owner { get; set; }

在Unity Application Block 1.0系列(3): 属性注入 中对属性注入做了较详细的说明。通过为属性加上[Dependency]标签, 然后通过Unity容器的Resolve方法自动做依赖注入,获取对象的实例。但是这种做法有个前提,就是对象的创建需要在我们的控制范围之内,也就是说这个对象需要在程序中创建(Resolve方法就是返回一个对象实例),而不是组件或类库中就创建好了。

对于这种情况,Unity提供了BuildUp方法来实现这样的需求。

BuildUp有以下几个重载方法:

BuildUp<T>(T existing)
BuildUp<T>(T existing, string name)
BuildUp(Type t, object existing)
BuildUp(Type t, object existing, string name)

还是实现上例中输出播放器拥有者名字的需求,把那段代码改为:

IUnityContainer container = new UnityContainer();

CoreLib coreLib = new CoreLib();
Player player = container.BuildUp<Player>(coreLib.CreatePlayer());

Console.WriteLine(player.Owner.Name);

输出为:

可以看出BuildUp方法已经自动为我们做了依赖注入了。

结束语:

从上面例子中可以看到,需要为 Player 类的 Owner 属性贴上 [Dependency] 标签 ( Attribute ) ,这样的话在组件或类库中可能会充斥一些类似[Dependency]这样的东西,这些只是为了用来为Unity服务,而没有任何其他用途。相对于Castle IOC容器和Spring.Net来说,Unity的侵入性更强。

作者:Inrie (洪晓军)
出处:http://www.cnblogs.com/inrie

转载于:https://www.cnblogs.com/inrie/archive/2008/04/18/1159015.html

Unity Application Block 1.0系列(5): 使用BuildUp让已存在对象实例也支持依赖注入相关推荐

  1. Unity Application Block 1.0系列文章

    Unity Application Block (Unity) 是微软 Patterns & Practices  团队开发的一个轻量级.可扩展的依赖注入容器,有助于构建松散耦合的系统.它支持 ...

  2. Unity Application Block 1.0系列(7): Lifetime Managers

    Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销 ...

  3. Unity Application Block 1.2 学习笔记 [转]

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  4. Unity Application Block 1.2 学习笔记(zhuan)

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  5. Unity Application Block 1.2 学习笔记

    昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.c ...

  6. Unity Application Block 3月12 发布的版本

    3月12日,Unity 又发布了正式发布之前的版本,这个版本提供了安装程序.并且提供了一个依赖注入在实现方式:Setter injection 的配置API.之前发布的版本,属性注入需要用[Depen ...

  7. Unity Application Block 发布

    今天Unity Application Block提前发布了,翻译一下下文纪念一下. 顺便推荐看看我整理的Castle方面的资料开源框架:Castle,这有助于你理解和使用Unity Applicat ...

  8. Updater Application Block v1.0 翻译文档目录

    为方便大家阅读有关Updater Application Block v1.0 的翻译文章,在本文中列出最近翻译的相关文章目录. Updater Application Block v1.0 介绍 U ...

  9. 微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2

    微软模式与实践团队发布Enterprise Library 4.1及Unity Application Block 1.2,具体可参看InfoQ的新闻http://www.infoq.com/cn/n ...

  10. 依赖注入容器Unity Application Block快速入门

    概述 Unity是微软模式与实践团队开发的一个轻量级.可扩展的依赖注入容器,之前我也有过一篇文章<Enterprise Library 4.0中的依赖注入容器(Unity)预览>对其做过介 ...

最新文章

  1. java 加载jar_java手动加载jar
  2. linux驱动由浅入深系列链接
  3. 6数组排序的方法_JavaScript数组排序方法
  4. 说说Android桌面(Launcher应用)背后的故事(九)——让我的桌面多姿多彩
  5. EF批量插入太慢?那是你的姿势不对
  6. oracle 11g数据库数据操作(亲测)
  7. inline函数_逼近函数(2)
  8. python面试题之Python支持什么数据类型?
  9. Eclipse 构建Maven项目--普通web项目 复制另外一个项目的配置文件导致的问题
  10. XML解析:PULL解析
  11. pythonajax学习_python学习-- django 2.1.7 ajax 请求
  12. android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序
  13. LINUX下载编译libopusenc-0.2.1.tar.gz
  14. Python中文文档概览
  15. python-can库基于PCAN-USB使用方法
  16. 如何使用IceSword冰刃
  17. known_hosts有什么用?
  18. 海康工业相机网口相机丢包问题解决方法
  19. Java导出带格式的Excel数据到Word表格
  20. 投影仪软件哪个好用?装上一起看TV,解锁追剧新体验

热门文章

  1. 阅读材料:信息技术年谱
  2. 解决python使用gmail smtp服务发邮件报错smtplib.smtpauthentic
  3. 5w2h原则指的是什么_5W2H指的是什么?
  4. jq 清除ajax缓存,js清除浏览器缓存的几种方法
  5. 【基金学习】小白基金学习记录-从入门到实践(一)
  6. csgo如何练习枪法?
  7. linux的pending状态怎么退出,状态pending是什么意思
  8. Java七牛云报400错误
  9. qq输入法 for linux,QQ输入法for Mac如何下载及安装
  10. JAVA实现GMT转换北京时间