这两种在autofac中注册实例的方式有什么区别?

5
这两种注册方式在Autofac中有什么区别呢?
builder.Register(c => Instance).As<ISomeInterface>();

并且

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

Instance是autofac模块中的一个(非静态)属性,在对象初始化器中设置,用于注册。

我提出问题的原因是因为在我正在调试的一段代码中,已经这样做了,但我得到了一些奇怪的行为,就好像有两个ISomeInterface实例浮动在周围。功能需要是让Instance在容器的生命周期内存活(=应用程序的生命周期)。

请不要告诉我不应该这样做-已经完成了,我正在尝试理解可能会出现什么问题/表现奇怪的结果。


我应该说,Instance没有实现IDisposable。 - SteveM
这可能与创建多个容器并且 Lambda 执行多次有关吗?类似的情况发生在这个问题中:https://dev59.com/WGPVa4cB1Zd3GeqP8LWT - Daniel J.G.
1个回答

2
这里有一个显著的区别。使用实例注册时,Instance属性中的引用将在容器构建期间传递给Autofac一次。未来的解析将始终获取相同的引用。使用lambda变量时,lambda表达式将在每次解析时执行,允许Instance属性在解析时返回存储在属性中的任何引用。理论上,您可以在应用程序的生命周期内更改Instance的内容,从而为在更改后解析的消费者提供不同的引用。

这是我已经知道的一个差异,并且彻底搜索了任何解析后实例属性的更改,但没有发现。如果不希望出现您所描述的可能性,则留下该可能性是糟糕的设计。如果这是唯一有意义的差异,我开始认为我看到的问题必须来自与autofac无关的其他方面。谢谢! - SteveM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接