使用简单注入器批量注册开放通用类型
Batch-Register Open-Generic Types with Simple Injector
我正在使用 Simple Injector,因为将一堆通用接口分配给它们的具体化真的很容易。尽管当我的泛型有两层深时,我 运行 遇到了障碍。我希望有一个我没有想到的简单解决方案。下面是一个手动挂接单个依赖的例子:
container
.Register<ICommandHandler<UpdateCommand<Schools>>, UpdateCommandHandler<Schools>>();
这是我想做的:
container.Register(typeof(ICommandHandler<UpdateCommand<>>), modelAssembly);
但是编译不了。
Register
Auto-RegistrationAPI跳过open-generic实现,例如UpdateCommandHandler<T>
,因为这些类型通常需要特殊处理。相反,Register
只会 select non-generic 实现。
要注册此 open-generic 实现,您必须明确注册它:
container.Register(typeof(ICommandHandler<>), typeof(UpdateCommandHandler<>));
或者,如果您有许多 open-generic 可以按任何特定顺序注册的实现,您可以 Auto-Register 所有 non-generic 和 open-generic 实现(装饰器除外) ) 如下:
var handlerTypes =
container.GetTypesToRegister(typeof(ICommandHandler<>), new[] { modelAssembly },
new TypesToRegisterOptions { IncludeGenericTypeDefinitions = true });
container.Register(typeof(ICommandHandler<>), handlerTypes);
我正在使用 Simple Injector,因为将一堆通用接口分配给它们的具体化真的很容易。尽管当我的泛型有两层深时,我 运行 遇到了障碍。我希望有一个我没有想到的简单解决方案。下面是一个手动挂接单个依赖的例子:
container
.Register<ICommandHandler<UpdateCommand<Schools>>, UpdateCommandHandler<Schools>>();
这是我想做的:
container.Register(typeof(ICommandHandler<UpdateCommand<>>), modelAssembly);
但是编译不了。
Register
Auto-RegistrationAPI跳过open-generic实现,例如UpdateCommandHandler<T>
,因为这些类型通常需要特殊处理。相反,Register
只会 select non-generic 实现。
要注册此 open-generic 实现,您必须明确注册它:
container.Register(typeof(ICommandHandler<>), typeof(UpdateCommandHandler<>));
或者,如果您有许多 open-generic 可以按任何特定顺序注册的实现,您可以 Auto-Register 所有 non-generic 和 open-generic 实现(装饰器除外) ) 如下:
var handlerTypes =
container.GetTypesToRegister(typeof(ICommandHandler<>), new[] { modelAssembly },
new TypesToRegisterOptions { IncludeGenericTypeDefinitions = true });
container.Register(typeof(ICommandHandler<>), handlerTypes);