0

我正在观看 Funq 的截屏视频,但我不明白测试代码中包含以下 lambda 的内容:

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

声明:

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

在 lambda 中,new Bar()充当TService,而c充当Register 方法中使用的 Func的容器。

在执行期间,这个 c 什么时候被删除?是不是一开始就创建的容器,因为我不明白一个Container的实例是什么时候传递给Register方法的。

4

1 回答 1

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方法接受 aFunc<T>而不是 a会容易得多Func<Container, T>。前面的代码片段看起来像这样:

container.Register<IBar>(() => 
{
    var bar = container.Resolve<Bar>();
    bar.SomeProperty = 5;
    return bar;
});
于 2012-07-13T14:26:42.827 回答