c# - Simple Injector 只注册具有多参数构造函数的类的一个参数
问题描述
我是创建“某种”基于消息的框架的团队的一员,人们可以在其中注册他们的消息处理程序以及他们对处理程序的依赖项。
工作人员将接收消息并调用相关处理程序。由于处理程序具有依赖关系,因此我们通过工作构造函数传递IDependecyResolver实现。Worker 使用这种抽象来创建这些处理程序。
我们框架的用户可以使用他们喜欢的任何 DI 容器,因此他们所要做的就是实现某些接口,为他们最喜欢的 DI 容器提供抽象。我的工作是为 SimpleInjector 提供一个实现,因此对于我们的框架,SimpleInjector 是开箱即用的。
我面临的问题是,即使我在容器中注册了SimpleInjectorDependencyResolver,容器也无法在运行时解析 IDependencyResolver 实现,我得到了这个。
这是我得到的例外。
ActivationException:ReactiveWorker<HelloModuleBase> 类型的构造函数包含名为“map”的参数和未注册的 IMessageHandlerMap<HelloModuleBase> 类型。请确保 IMessageHandlerMap<HelloModuleBase> 已注册,或更改 ReactiveWorker<HelloModuleBase> 的构造函数。
这是我的注册代码:
registrant.Register<IDependencyResolver>(LifeSpan.Scoped);
registrant.Register<IMessageHandlerMap<TChildModule>>(t0, LifeSpan.Scoped);
worker 需要一个消息处理映射和一个依赖解析器。
这是我的带有参数化构造函数的类:
public sealed class ReactiveWorker<TOwnerModule>: IWorker
{
readonly IMessageHandlerMap<TOwnerModule> _map;
readonly IDependencyResolver _resolver;
public ReactiveWorker(IMessageHandlerMap<TOwnerModule> map, IDependencyResolver resolver)
{
_map = map;
_resolver = resolver;
}
}
我希望每个人都能理解这个场景。
解决方案
我正在尝试为我的项目中/将要使用的所有依赖解析器创建一个抽象类/层。
这听起来确实像您正在应用Service Locator 反模式。您可能需要仔细检查您所做的是依赖注入还是服务位置,并尽可能阻止服务位置。
此外,从发布的注册来看,您似乎正在尝试实施批量注册行为。Simple Injector 确实包含开箱即用的功能,值得投资于 Simple Injector 的 API,看看您是否可以让工具完成这项工作。
例如,您Helper.FindConcreteImplementationsOf
的 看起来很像 Simple Injector 的Container.GetTypesToRegister
方法。它返回给定类型的具体实现,例如:
Type[] types = container.GetTypesToRegister(typeof(IMessageHandler<>), asm);
Simple Injector 还允许将开放通用抽象映射到开放通用实现。MessageHandlerMap<T>
例如,使用您的 ,您可以执行以下操作:
container.Register(
typeof(IMessageHandlerMap<>),
typeof(MessageHandlerMap<>),
Lifestyle.Scoped);
这确保了MessageHandlerMap<T>
每次IMessageHandlerMap<T>
请求关闭版本时都会创建关闭版本。然而,这确实依赖于 Simple Injector 的 Auto-Wiring 能力,这意味着 Simple Injector 必须能够将所有依赖项注入到类的构造函数中。这可能意味着您必须更改构造函数MessageHandlerMap<T>
才能让 Simple Injector Auto-Wire 类型。
因为我不清楚它的功能MessageHandlerMap<T>
是什么以及它的实现是什么样的,所以我无法完全掌握你想要实现的目标,因此不能给你更具体的建议来改变你的设计。
祝你好运。
推荐阅读
- java - spring mvc应用程序中的休眠连接数
- php - 如何将数组的第一个索引与其他数组的第一个索引合并
- serial-port - 有关硬件设备与计算机之间通信的信息
- php - php curl 给出与命令行不同的结果
- javascript - 事件侦听器仅在第二次单击后正确触发
- c# - unity injectionconstructor vs injectionfactory 懒惰
- javascript - NextJS 断点在页面刷新或 vscode 中的代码更改后停止命中
- ldap - 使用 ldap 进行身份验证,无需用户密码
- angular - 如何在两种不同的场景中使用 ngModel
- raspberry-pi - 是否可以制作具有非实时操作系统的飞行控制器?