2012-07-13 91 views
0

我华清Funq的截屏使用,但我不明白,用下面的拉姆达在测试代码的东西:实例容器的Funq

var container = new Container(); 
container.Register<IBar>(c => new Bar()); 

声明:

public void Register<TService>(Func<Container, TService> factory) { ... } 

在lambda,新Bar()充当TServicec作为容器为Func在Register方法中使用。

在执行过程中,这个c是何时被删除的?它是在开始时创建的容器,因为我不明白Container的实例何时传递给Register方法。

回答

3

在执行过程中,这个c是什么时候声明的?

你做,使用以下行:

var container = new Container(); 

Funq实际上通过一个实例来本身所提供的委托。这允许您,例如,要做到以下几点:

container.Register<IBar>(c => 
{ 
    var bar = c.Resolve<Bar>(); 
    bar.SomeProperty = 5; 
    return bar; 
}); 

然而,通过容器本身的委托它挺有用IMO,因为在注册过程中该值始终可用。举例来说,你也可以这样写:

container.Register<IBar>(unused => 
{ 
    var bar = container.Resolve<Bar>(); 
    bar.SomeProperty = 5; 
    return bar; 
}); 

换句话说,这本来是容易得多,如果该Register方法接受一个Func<T>而不是Func<Container, T>的。以前的代码片段应该是这样的:

container.Register<IBar>(() => 
{ 
    var bar = container.Resolve<Bar>(); 
    bar.SomeProperty = 5; 
    return bar; 
});