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 的通用测试。
我有一个通用服务,它对任何给定的 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