IRepository<BaseType> 类型的 C# 方法参数不接受继承自 BaseType 的实现

C# Method argument of Type IRepository<BaseType> doesnt accept implementation inheriting from BaseType

我有一个通用服务,它对任何给定的 request/response 组合执行相同的操作。唯一发生任何特定事情的时间是涉及到持久性。我正在尝试根据正在使用的一种类型 (TRequest) 注入存储库的特定实现。到目前为止,我有以下内容,但是 Ninject 和集成测试未能找到任何与其寻找的内容相匹配的存储库,类型为 EntityBase 的存储库。我认为这会很好,因为我的特定实体继承自 EntityBase...

Error CS1503 Argument 1: cannot convert from 'Repositories.IRepository<Models.PersonModel>' to 'Repositories.IRepository<Models.EntityBase>'

编辑:我知道为什么我会收到当前错误,它非常明确。有什么想法可以实现吗?

PersonModel.cs

public class PersonModel : EntityBase
{
    blah blah
}

IRepository.cs

public interface IRepository<T> 
{
    T Get(int id);
    void Add(T entity);
    void Delete(int id);
}

PersonRepository.cs

public class PersonRepository : IRepository<PersonModel> 
{
    blah blah
}

Service.cs

public class Service<TRequest, TResponse> : IService<TRequest, TResponse>
{
    private readonly IRepository<EntityBase> _repository;

    public Service(IRepository<EntityBase> repository)
    {
        _respository = repository
    }

    public TResponse Call(TRequest request)
    {
        var requestEntity = MapperFactory.GetMapperFor(typeof(TRequest)).Map(request); 

        _repository.Add(requestEntity)

        blah blah blah return            
    }
}

IoCModule.cs

Bind<IRepository<PersonModel>>().To<PersonRepository>();

这是因为即使 PersonModel 继承自 EntityBase,但这并不意味着 IRepository<PersonModel> 继承自 IRepository<EntityBase>

一种可能的处理方法是使用第三种泛型类型:

public class Service<TRequest, TResponse, T> : IService<TRequest, TResponse, T>
{
    private readonly IRepository<T> _repository;
}

或者另一种方式是指定服务的类型:

public class PersonService<TRequest, TResponse> : IService<TRequest, TResponse>
{
    private readonly IRepository<PersonModel> _repository;
}

因为 Repositories.IRepository<Models.PersonModel>Repositories.IRepository<Models.EntityBase> 实际上是不同的类型。

因为您的 IRepository< T > 使用 T 作为参数(输入),您不能使 IRepository< T> 协变,从而允许将 IRepository< PersonModel> 分配给 IRepository< EntityBase>。所以 IoC 不能在这里工作。

您需要为 IRepository 的每个实现编写特定的单元测试,而不是依赖 IRepository 的通用测试。