2012-07-13 90 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; 
});