簡體   English   中英

IRepository類型的C#方法參數 <BaseType> 不接受從BaseType繼承的實現

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

我有一個通用服務,可以對任何給定的請求/響應組合執行相同的操作。 任何特定的事情唯一發生的時間就是持久性。 我正在嘗試根據使用中的一種類型(TRequest)注入存儲庫的特定實現。 到目前為止,我有以下內容,但是Ninject和集成測試未能找到與其所需內容相匹配的任何存儲庫,即EntityBase類型的存儲庫。 我認為這很好,因為我的特定實體繼承自EntityBase ...

錯誤CS1503參數1:無法從“ Repositories.IRepository <Models.PersonModel>”轉換為“ 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;
}

因為您的IRepository <T>使用T作為參數(輸入),所以您無法使IRepository <T>協變量,從而允許將IRepository <PersonModel>分配給IRepository <EntityBase>。 因此,IoC無法在這里工作。

您將需要針對IRepository <T>的每個實現編寫特定的單元測試,而不是依賴於IRepository <EntityBase>的通用測試。

因為Repositories.IRepository<Models.PersonModel>Repositories.IRepository<Models.EntityBase>實際上是不同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM