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

什么情况下使用Method Call Injection

当实例化父对象时也能自动实例化所依赖的对象
通过简单的方式使得很容易做到在代码中查看每个类所依赖的项
父对象有很多相互之间有关联关系的构造器,导致在调试和维护时很不方便
父对象包含有很多参数构造器,特别是参数类型相似的只能通过参数的位置来辨别的
隐藏依赖的对象,不作为属性暴露出去
通过修改依赖对象的代码来控制哪些对象可以被注入,而不用改动父对象或应用程序


准备工作

public interface IPlayer
{
    
void Play();
}

public class Mp3Player : IPlayer
{
    
public Song mSong;

    [InjectionMethod]
    
public void Init(Song song)
    {
        
this.mSong = song;
    }

    
public void Play()
    {
        Console.WriteLine(
string.Format("{0}: Now Playing [{1}] Singing by ({2})"this.Name, this.mSong.Name, this.mSong.Singer));
    }

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

开始

Constructor Injection在容器创建对象实例时就会触发执行,而Method Call Injection在具体调用对象实例的方法时候才触发。

通过为类的方法贴上[InjectionMethod]标签,使得Unity容器在获取类对象实例时,自动实例化该方法所依赖的对象,注入到该方法中。

看一个例子:

Mp3Player类中为Init(Song song)方法贴上了[InjectionMethod]标签:

[InjectionMethod]
public void
 Init(Song song)
{
  
this.mSong =
 song;
}

可以通过下面的方式来获取Mp3Player对象实例:

IUnityContainer container = new UnityContainer();

container.RegisterType
<IPlayer, Mp3Player>
();

IPlayer player 
= container.Resolve<IPlayer>
();
player.Play();

输出:

Unity 3-4.jpg

这里通过为Mp3Player类的Init方法贴上[InjectionMethod]标签,来表示Unity容器装载Mp3Player对象时将自动实例化所依赖的对象(即Song对象),然后注入到Mp3Player的Init方法里 (执行该方法)。

即这里主要做两个操作:

1. Song song = new Song();

2. this.mSong = song;

注入到已存在的对象实例

用Resolve方法来获取已存在的对象实例时不会做 Property Injection,因为该对象的创建没受到 Unity 容器的任何影响。可以使用BuildUp方法来强制实现 Property Injection。

关于BuildUp方法可参考:
Unity Application Block 1.0系列(5): 使用BuildUp让对象实例也支持依赖注入


结束语

使用 Method Call Injection 需要特别注意不要有循环引用,否则可能会导致应用程序出错,至于循环引用的具体说明会有专门一篇文章介绍。

作者:Inrie (洪晓军)
出处:http://www.cnblogs.com/inrie
posted on 2008-04-18 00:08 Inrie(洪晓军) 阅读(412) 评论(6)  编辑 收藏 所属分类: Application Block

FeedBack:
2008-04-21 22:04 | 浪子      
Method Call Injection 与 Constructor Injection有啥区别?

各自的使用场景?
  回复  引用  查看    
#2楼 [楼主]
2008-04-22 21:22 | Inrie(洪晓军)      
@浪子
谢谢老大提醒,已经补充进去。

Constructor Injection在容器创建对象实例时就会触发执行,而Method Call Injection在具体调用对象实例的方法时候才触发。
  回复  引用  查看    
2008-05-08 09:45 | 鹰击长空      
好文章,一步步学习
  回复  引用  查看    
#4楼 [楼主]
2008-05-08 09:54 | Inrie(洪晓军)      
@鹰击长空

谢谢支持!
  回复  引用  查看    
2008-05-08 10:08 | 鹰击长空      
上一篇文章用抽象类Player,这次用接口IPlayer,应该没有深层含义吧,至少我没有看出来。
  回复  引用  查看    
#6楼 [楼主]
2008-05-08 10:19 | Inrie(洪晓军)      
@鹰击长空

没有深层含义: )

上一篇中因为要用到两个具体的Player类:Mp3Player和CdPlayer,而这两个类都共有Song属性和Player()方法,所以用抽象基类。

这一篇为了更好的演示效果,就使用接口。

从Unity容器角度来看,用抽象类或是接口都是一样的道理。
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-01 13:06 编辑过


相关链接:
 

Msn:
hongxiaojun(at)live.com

Mail/Gtalk:
hongxiaojun(at)gmail.com

与我联系

搜索

 

常用链接

留言簿(1)

我管理的小组

我参与的团队

我的标签

随笔分类(47)

随笔档案(48)

Friends

最新随笔

最新评论

阅读排行榜

评论排行榜