c# - Autofac - 在运行时解析类型或实现相同接口的类型
问题描述
我是使用 IoC/DI 的新手,我正在学习 Autofac 以在我的 Xamarin Form、C# 项目中使用它。我正在阅读 Autofac 文档(https://autofac.readthedocs.io/en/latest/getting-started/index.html#application-execution),我对与应用程序执行部分相关的声明感到困惑,它说:
“稍后,如果您希望您的应用程序写入不同的日期,您可以实现不同的 IDataWriter,然后在启动时更改注册。... ”
我对此感到困惑,因为它说如果我想要不同的 IDataWritter,我需要在启动时更改注册。
如果我不知道我想在启动时使用哪个 IDataWritter 实现怎么办。例如,我有由 ClassA、ClassB 和 ClassC 实现的 IDataWritter 接口,在运行时,我必须以某种方式解决 3 个或全部 3 个?
解决方案
这是一个很好的问题 :) 但这也是一个陷阱 :) 尽管如此,我会根据自己的经验跳出陷阱并回答,并接受这可能产生的强烈反对。
因此,在您的问题中,您描述了不同的场景,但主要问题可能是“如果我不知道我想在启动时使用哪种实现怎么办”。根据我的经验,设计良好的系统很少出现这种情况。
当我试图从总体上理解 DI 时,在软件工程术语之外思考它很有帮助。DI 基本上无非就是应用接口来帮助你的组件协同工作;这一原则也适用于其他工程领域。
举个例子:如果你拿一块主板,它有用于基本构成 PC 的不同组件的插槽:它有一个用于 CPU 的插槽,一个用于显卡的插槽等。然后你有英特尔制造的实际 CPU或与可插入插座兼容的AMD。并且您有Nvidia或ATI制造的显卡(它们仍然存在吗?:)),可以插入。原理相同:主板可以是在你的应用程序中的具体类,套接字是实际的 C# 语言接口(你没有明确说明它,我假设 C#),这些被注入到你的具体类中(例如通过构造函数注入),然后你有其他类实现在启动时注册的接口(“套接字”)。
我解释了这个类比来支持我的论点:如果您有一块主板要用于您的 PC,则必须在启动系统之前组装所有组件。DI 也是如此:您可以随时更改组件,这不是 DI 的魔力。DI 的神奇之处在于,如果您更改了一个组件,那不应该影响另一个组件。也就是说,如果您想插入不同的显卡,则不必重建整个主板(以及可能的其他组件)。
话虽如此,确实存在一些场景,您提供的示例出现并且您必须以某种方式欺骗系统(最常见于基于插件的系统中)。毕竟,如果我的类比扩展到 USB 或 HDMI,我们有即插即用设备,不需要您关闭然后进行更改。但是要细细说来,这些并不是 PC 的真正依赖项,只是可选的额外外围设备,因此应该以不同的方式对待它们。但是为了不分叉并再次承认在某些情况下需要这种动态特性,这里有一些您应该研究的其他资源(请注意,这些是 Autofac 特定的实现,但大多数 DI 容器具有类似的功能):
推荐阅读
- symfony - 无法覆盖主页尾部斜杠
- .net - 点击失败
- python-3.x - Python pynput - 程序在启动时滞后
- android - Android studio 3.3 错误构建 apk 或运行应用程序
- python - 为什么基本子集和算法不处理负值?
- r - Highcharter酒吧颜色问题
- java - 为什么 Spring 不能实例化我的自定义 ApplicationContext?
- python - Transcrypt编译错误Python 3.7 Windows
- android - 如何在 EditText 中用逗号分隔数字
- javascript - 两个视觉上相同的文本位如何与剪贴板不同?