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

准备工作

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

Unity Application Block 1.0系列(5): 使用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 { 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; }

IUnityContainer container = new UnityContainer();

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

Console.WriteLine(player.Owner.Name);

相关文章: