仅使用类型参数注册 IEnumerables 的实现

Registration of implementation for IEnumerables only using type parameters

我正在尝试弄清楚注册接口的特定实现的语法,但我无法弄清楚(使用 Simple Injector)。我的界面签名如下所示:

public interface IAdditionalDataService<TResult, TModel>

我想为第一个类型参数是 TModel 类型的 IEnumerable 注册一个实现,例如:

public class CompositeAdditionalDataService<TModel>
                 : IAdditionalDataService<IEnumerable<TModel>, TModel>

我该怎么做?

我试过这个:

container.RegisterOpenGeneric(typeof(IAdditionalDataService<,>),
    typeof(CompositeAdditionalDataService<>));

当我验证容器时出现错误,说没有 IAdditionalDataService<List<User>, User> 的注册,所以我的注册无效。

我也试过这个:

container.RegisterOpenGeneric(typeof(IAdditionalDataService<IEnumerable<>,>),
    typeof(CompositeAdditionalDataService<>));

但这显然无法编译,因为它不是有效的语法。

所以我的问题是

如何注册我的实现,以便在请求 IAdditionalDataService, TModel> 时使用它,其中 TModel 是一个类型参数,所以它几乎可以是任何东西?

您应该将通用实现更改为以下内容:

public class CompositeAdditionalDataService<TCollectionResult, TModel>
    : IAdditionalDataService<TCollectionResult, TModel>
    where TCollectionResult : IEnumerable<TModel>

并注册如下:

// Simple Injector v3.x
container.Register(
    typeof(IAdditionalDataService<,>),
    typeof(CompositeAdditionalDataService<,>));

// Simple Injector v2.x
container.RegisterOpenGeneric(
    typeof(IAdditionalDataService<,>),
    typeof(CompositeAdditionalDataService<,>));