使用简单注入器批量注册开放通用类型

Batch-Register Open-Generic Types with Simple Injector

我正在使用 Simple Injector,因为将一堆通用接口分配给它们的具体化真的很容易。尽管当我的泛型有两层深时,我 运行 遇到了障碍。我希望有一个我没有想到的简单解决方案。下面是一个手动挂接单个依赖的例子:

container
    .Register<ICommandHandler<UpdateCommand<Schools>>, UpdateCommandHandler<Schools>>();

这是我想做的:

container.Register(typeof(ICommandHandler<UpdateCommand<>>), modelAssembly);

但是编译不了。

RegisterAuto-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);