我正在创建一个存储库,如下所示:
public class StagingRepository
{
private IRepository<CurrentTransformer> CurrentTransformerRepository { get; set; }
private IRepository<Equipment> EquipmentRepository { get; set; }
private IRepository<Line> LineRepository { get; set; }
public StagingRepository()
{
this.CurrentTransformerRepository = new Repository<CurrentTransformer>();
this.EquipmentRepository = new Repository<Equipment>();
this.LineRepository = new Repository<Line>();
}
}
所有这些都有效...但是我想要添加的是类中的一个方法,它根据字符串值返回上面的一个存储库。
public IRepository<Object> SetRepo(string TableName)
{
switch (TableName)
{
case "Line":
return LineRepository;
break;
}
}
我知道上面的内容不起作用,但它可以让你了解我想要完成的任务。我的目标是我应该能够在我的代码中设置这样的东西来调用存储库:
StagingRepository _repo = new StagingRepository();
var myList = _repo.SetRepo("Line").All(); //All is a function of IRepository
非常感谢任何帮助。
答案 0 :(得分:3)
您可以IRepository
covariant:
public interface IRepository<out T>
这样,从方法返回时,您始终可以使用IRepository<Derived>
代替IRepository<Base>
。在您的情况下,您的代码现在将编译并运行:
public IRepository<object> SetRepo(string TableName)
{
switch (TableName)
{
case "Line":
return LineRepository;
break;
}
}
因为Line
来自object
,所以您可以IRepository<Line>
返回IRepository<object>
。
如果使用T
作为参数,这将不起作用 - 类型不能同时变形和逆变。在这种情况下,请考虑将非通用方法从IRepository<T>
移动到非通用版本IRepository
,并使您的存储库同时实现这两种方法。这样你就可以:
public IRepository SetRepo(string TableName)
// ...
顺便说一句,名称SetRepo
具有误导性 - 该功能没有设置任何内容,而是“获取”适当的存储库。