将类实例注入泛型接口



我有这个模型类:

public class FunctieModel: ObservableObject
{ ... }

存储库的基本接口:

public interface IBaseRepo<T> where T : ObservableObject
{
    void Delete(int id);
    T GetItem(int id);
    IEnumerable<T> GetList();
    bool Update(T model);
    bool Insert(T model);
}

FunctieModel 类型存储库的特定接口

public interface IFunctieRepo : IBaseRepo<FunctieModel>
{}

我的FunctieModels:存储库的实现

public class FunctieRepoSql : IFunctieRepo
{...}

我的测试程序类必须能够与必须注入的存储库一起工作:

public class Tester    
{
    IBaseRepo<ObservableObject> repo;
    public Tester(IBaseRepo<ObservableObject> repo)
    {
        this.repo = repo;
    }
}

这一切都很好。现在我需要用不同的存储库实例化测试程序类。

new Tester(new FunctieRepoSql())

这就是我的问题所在。错误为
无法从FunctieRepoSql转换为IBaseRepo<ObservableObject>

我显然错过了什么。有人知道我该怎么做吗?

无法将IBaseRepo<FunctieModel>转换为IBaseRepo<ObservableObject>。例如,想象一个普通的集合,比如猫,如果你把它转换成一个动物集合,你就可以在其中添加一只狗,这是不可取的。但是,您可以在此处使用out关键字:

public interface IBaseRepo<out T> where T : ObservableObject

但是,您将无法接受ObservableObjects作为输入(msdnabout-out)。

您需要考虑两个关键选项。最简单的方法是简单地使Tester通用,并使用一个可以传递给IBaseRepo<T>的类型参数。

public class Tester<T> where T : ObservableObject
{
    IBaseRepo<T> repo;
    public Tester(IBaseRepo<T> repo)
    {
        this.repo = repo;
    }
}

然后您可以将您的呼叫代码更改为:

new Tester<FunctieModel>(new FunctieRepoSql())

如果由于任何原因无法使用此技术,则可以创建另一个非通用接口IBaseRepoIBaseRepo<T>对此接口进行扩展。它应该将等效方法表示为IBaseRepo<T>(对于那些使用T的方法),但在不使用该类型参数的情况下声明它们。这类似于IEnumerableIEnumerable<T>。完成此操作后,可以使Tester在其构造函数中接受IBaseRepo,而不是通用版本。

最新更新