[英]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())
如果因任何原因,你不能使用这个技术,你可以改为创建另一个非通用接口, IBaseRepo
是IBaseRepo<T>
延伸。 它应该使用与IBaseRepo<T>
等效的方法(对于那些使用T
方法),但应在不使用该类型参数的情况下声明它们。 这类似于IEnumerable
和IEnumerable<T>
。 完成此操作后,您可以使Tester
在其构造函数而不是通用版本中接受IBaseRepo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.