gpt4 book ai didi

c# - Composite 的简单注入(inject)器注册,结合了开放和封闭的通用实现

转载 作者:行者123 更新时间:2023-11-30 12:27:25 24 4
gpt4 key购买 nike

我正在为我的命令创建验证装饰器,但我在使用 Simple Injector DI 容器注册类型时遇到了问题。

案例是:

  • 我(目前)有一个应该始终应用的验证器,DataAnnotationsCommandValidator<TCommand> .
  • 我还有几个应用于特定命令的验证器。一个例子是 CreateRefreshTokenCommandValidator , 它实现了 ICommandValidator<CreateRefreshTokenCommand> .

根据Simple Injector documentation ,应该创建一个 CompositeCommandValidator在这些情况下。我模仿了文档中提到的实现,这意味着我的 ValidationCommandHandlerDecorator仍然可以依赖于 ICommandValidator<TCommand>而不是 IEnumerable .

然后是Simple Injector容器的配置。我的配置目前看起来像这样:

_container.RegisterManyForOpenGeneric(
typeof(ICommandValidator<>),
_container.RegisterAll,
typeof (ICommandValidator<>).Assembly);

_container.RegisterAllOpenGeneric(
typeof(ICommandValidator<>),
typeof(DataAnnotationsCommandValidator<>));

_container.RegisterSingleOpenGeneric(
typeof(ICommandValidator<>),
typeof(CompositeCommandValidator<>));

但是,当我调试应用程序时,只有特定的验证器被注入(inject)到 CompositeCommandValidator 中(我错过了 DataAnnotationsCommandValidator )。我尝试了几种不同的配置,但无济于事。我应该如何配置 Simple Injector 以获得正确的行为?

最佳答案

简单注入(inject)器 v4 的更新:

// Register validators as sequence
_container.Collection.Register(
typeof(ICommandValidator<>),
typeof (ICommandValidator<>).Assembly);

// Append the data annotations validator as last element to the sequence
_container.Collection.Append(
typeof(ICommandValidator<>),
typeof(DataAnnotationsCommandValidator<>));

// Register the composite that will wrap the sequence.
_container.Register(
typeof(ICommandValidator<>),
typeof(CompositeCommandValidator<>));

原始简单注入(inject)器 v2 答案:

RegisterManyForOpenGeneric方法将只扫描给定接口(interface)的非泛型实现的程序集,因为开放泛型实现通常需要特别注意。这里基本上有两个选项。

选项 1:

var types = OpenGenericBatchRegistrationExtensions.GetTypesToRegister(
_container,
typeof (ICommandValidator<>),
AccessibilityOption.PublicTypesOnly,
typeof (ICommandValidator<>).Assembly)
.ToList();

types.Add(typeof(DataAnnotationsValidator<>));

_container.RegisterAll(typeof(ICommandValidator<>), types);

这里我们使用 GetTypesToRegister方法来查找所有非泛型实现,我们将开放泛型类型附加到此集合并使用 RegisterAll 注册整个集合.

您的第二个选择是混合 RegisterManyForOpenGenericAppendToCollection :

_container.RegisterManyForOpenGeneric(typeof(ICommandValidator<>), 
_container.RegisterAll,
typeof(ICommandValidator<>).Assembly);

// using SimpleInjector.Advanced;
_container.AppendToCollection(typeof(ICommandValidator<>),
typeof(DataAnnotationsValidator<>));

关于c# - Composite 的简单注入(inject)器注册,结合了开放和封闭的通用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25444578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com