在 Autofac 中注册临时组件

Registration of ephemeral components in Autofac

我在一个从多个“设备”读取和写入信息的应用程序中使用 Autofac。 这些设备可以随时出现和消失,它们的生命周期不受应用程序的控制。它们也可以在不同的界面上找到; USB 和 IP 网络。所有设备都有一个通用的 IDevice 接口。

将此发现集成到 Autofac 中的建议机制是什么?由于设备本身是短暂的,我知道我需要能够将它们从容器中移除,我还在 SO 搜索中发现这是不可能的 (Is it possible to remove an existing registration from Autofac container builder?)

我现在更倾向于在 Autofac(IDeviceFactory 或类似的)中注册一个工厂,然后在需要时查询该工厂以获取当前设备列表的想法。该工厂将维护它自己的可用硬件接口(USB COM 端口或以太网接口)的内部列表,然后是这些硬件接口上可用的设备列表。

感觉如果我不将它用于 IDevice 本身,我可能会失去 Autofac 的很多好处。 我应该调查修改服务解析器管道吗?

我不想陷入拼命尝试“Autofac all the things!”的陷阱。如果它不是正确的工具,但我也不想不必要地编写与 Autofac 一起使用的我自己的组件注册表。

Autofac 不会是这里的方式,请与工厂一起使用。

出于性能原因,Autofac 需要能够缓存注册,这是您无法从容器中删除内容的众多原因之一。假设您可以创建一个包含设备的生命周期范围,并且 dispose/recreate 每次设备列表更改时,但这会使您的应用不稳定,因为从该范围解决的任何问题也将被处理并重新创建。

也有可能,设备列表可能会随着一些 class 逻辑的执行而改变。您需要在需要使用设备时使用最新列表,这意味着在那个时候进行查询——就像您在需要时从数据库中查询数据而不是将其作为依赖项注入一样。

跟工厂走就好了