繁体   English   中英

将类实例注入通用接口

[英]Injecting a class instance to a generic interface

我有这个模型课:

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作为输入( msdn关于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM