【发布时间】:2020-12-12 12:40:40
【问题描述】:
(编辑:写完这个问题后,我找到了至少一个解决方案,所以这个问题是自我回答的。它可能仍然受益于一双比我更了解 IoC 容器的眼睛。)
我有一个非常特殊的场景,它闻起来可以使用 IoC 容器,但是技术细节使得使用现有容器变得困难。
这个场景是我在玩弄用户界面组件(实际上是 Blazor 组件,所以我们称它们为 Components)与它们绑定的模型类(我们称它们为 UiObjects)的以下分离。
所有UiObjects 都有一个可以绑定到它们的默认Component<U>(即where U : IUiObject)(认为U = IUiCommand 到GenericButtonComponent 是Component<IUiCommand> 等),但是用户界面设计人员可以通过添加新的SpecialButtonComponent(也是Component<UiCommand>)来覆盖样式和逻辑,然后它也可以与IUiCommand 一起使用。这个特殊组件在 html、css 甚至状态逻辑方面可能与旧组件不同,但它始终是默认组件的直接替代品。
我知道需要一些灵活的方法来为每个U 选择正确的Component<U>,这是一个IUiObject,基于各种事情(从组件中收集、xml 配置、聪明的机制来优先考虑每个类型其他等等)。
您可能认为这正是 IoC 容器的用途,但有一个问题:Blazor 希望我交付 Blazor 然后自己创建的类型,而不是实例。我需要一个
Type componentType = container.ResolveType<IUiCommand>()
我从表面上看过 Autofac、Castle Windsor、Lamar、LightInject、SimpleInjector 并在写完这个问题后才意识到至少 SimpleInjector 可以解析包含已解析类型的DependencyMetadata<IFoo> - 到目前为止,任何其他框架都没有运气不过。
所以我会在这里回答我自己的问题,但我仍然想知道还有哪些其他 IoC 容器具有该功能。
【问题讨论】:
-
在 .NET 5 中,有一个
IComponentActivator抽象。它允许覆盖 Blazor 组件的分辨率。它允许您自己创建这些实例或将其委托给容器。
标签: dependency-injection ioc-container simple-injector