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

本文关键字:IEnumerables 实现 注册 类型参数 | 更新日期: 2023-09-27 18:04:05

我试图找出语法来注册一个接口的特定实现,我只是不能弄清楚(使用简单的注入器)。我的接口签名是这样的:

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是一个类型参数,所以它可以是几乎任何东西?

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

您应该将您的泛型实现更改为:

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