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



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

错误CS1503参数1:无法从"Repository.IRepository<Models.PersonModel>'to'存储库.IDepository<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;
}

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

您将需要为IRepository<T> ,而不是依赖于IRepository<EntityBase>。

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

相关内容

  • 没有找到相关文章

最新更新