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

时间:2017-01-18 14:43:38

标签: c# generics repository ninject

我有一个通用服务,它针对任何给定的请求/响应组合执行相同的操作。任何特定事件发生的唯一时间就是持久性。我试图根据正在使用的一种类型(TRequest)注入一个特定的存储库实现。到目前为止,我有以下内容,但是Ninject和集成测试未能找到任何与其查找匹配的存储库,即EntityBase类型的存储库。我认为没问题,因为我的特定实体继承自EntityBase ...

  

错误CS1503参数1:无法转换为&#39; Repositories.IRepository&lt; Models.PersonModel&gt;&#39;到&#39; Repositories.IRepository&lt; Models.EntityBase&gt;&#39;

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

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

3 个答案:

答案 0 :(得分:1)

这是因为尽管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;
}

答案 1 :(得分:1)

因为您的IRepository&lt; T>使用T作为参数(输入),你不能使用IRepository&lt; T&GT;协变,因此允许分配IRepository&lt; PersonModel&GT;到IRepository&lt; EntityBase取代。所以IoC无法在这里工作。

您需要编写特定于IRepository&lt;的每个实现的单元测试。 T>,而不是依赖于IRepository的通用测试&lt; EntityBase&GT;

答案 2 :(得分:0)

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