Inrie(洪小军)
Wake up every day with a feeling of passion for the difference technology will make in our life.
posts - 52,  comments - 123,  trackbacks - 4

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

准备工作

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

Unity 5-1.jpg

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 { getset; }
}

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 { getset; }

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);

输出为:

Unity 5-2.jpg

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

结束语:

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

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

posted on 2008-04-18 00:09 Inrie(洪小军) 阅读(423) 评论(4)  编辑 收藏 所属分类: Application Block

FeedBack:
2008-04-18 08:49 | 李战      
路过
  回复  引用  查看    
2008-04-21 22:08 | 浪子      
看到这里,对于Resolve和BuildUp,似乎是以前OB的[Dependency("Name")]
和[CreateNew]的翻版,不知道Unity中是否有CreateNew这个Attribute.
  回复  引用  查看    
2008-05-08 10:18 | 鹰击长空      
跟着你一步步学习
  回复  引用  查看    
#4楼 [楼主]
2008-05-08 10:21 | Inrie(洪晓军)      
@鹰击长空

最近这段时间太忙了,都没有继续写这个系列接下来的文章:)
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-20 02:43 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
 

Msn:
hongxiaojun(at)live.com

Mail/Gtalk:
hongxiaojun(at)gmail.com

与我联系

搜索

 

常用链接

留言簿

我管理的小组

我参与的团队

我的标签

随笔分类(48)

随笔档案(49)

Friends

最新随笔

最新评论

阅读排行榜

评论排行榜