5

这两个注册之间的autofac有什么区别:

builder.Register(c => Instance).As<ISomeInterface>();

builder.RegisterInstance(Instance).As<ISomeInterface>().SingleInstance().ExternallyOwned();

其中 Instance 是发生注册的 autofac 模块的(非静态)属性,由对象初始化程序设置。

我问的原因是前者已经在我正在调试的一段代码中完成,并且我得到了一些奇怪的行为,好像有两个 ISomeInterface 实例漂浮在周围。功能需求是实例在容器的生命周期内(=应用程序的生命周期)而存在。

请不要告诉我我不应该做第一个 - 它已经完成了,我试图了解可能出现的问题/结果奇怪的行为。

4

1 回答 1

2

这里有一个显着的区别。通过实例注册,Instance 属性中的引用将在容器构建期间传递给 Autofac 一次。未来的解决方案将始终提供相同的参考。

使用 lambda 变体,lambda 将在每个 resolve上执行,允许 Instance 属性返回在解析时存储在属性中的任何引用。从理论上讲,您可以在应用程序的生命周期内更改 Instance 的内容,从而为更改后解析的消费者提供不同的引用。

于 2013-05-22T17:45:48.863 回答