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

通过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 {  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);

输出为:

Unity 5-2.jpg

可以看出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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值