我想创建一个界面,例如...
interface IRepository<params T>
{
T GetAll();
}
class PersonRepository : IRepository<Employees,Students>
{
Employees GetAll();
Students GetAll();
}
很清楚,我知道具体的实现是不可能的,但是有没有办法采用多实体存储库并创建一些超级基础接口?
我想创建一个界面,例如...
interface IRepository<params T>
{
T GetAll();
}
class PersonRepository : IRepository<Employees,Students>
{
Employees GetAll();
Students GetAll();
}
很清楚,我知道具体的实现是不可能的,但是有没有办法采用多实体存储库并创建一些超级基础接口?
这是可能的:
namespace ConsoleApplication12
{
public class Employee
{
public string EmpName { get; set; }
public override string ToString()
{
return this.EmpName;
}
}
public class Student
{
public string StudName { get; set; }
public override string ToString()
{
return this.StudName;
}
}
public class Other
{
public int TestField { get; set; }
public override string ToString()
{
return this.TestField.ToString();
}
}
public interface IRepository<T>
{
List<T> GetAll();
}
public class PersonRepository : IRepository<Employee>, IRepository<Student>, IRepository<Other>
{
List<Student> IRepository<Student>.GetAll()
{
return new List<Student> { new Student { StudName = "test2" } };
}
List<Other> IRepository<Other>.GetAll()
{
return new List<Other> { new Other { TestField = 42 } };
}
List<Employee> IRepository<Employee>.GetAll()
{
return new List<Employee> { new Employee { EmpName = "test1" } };
}
}
public class Program
{
private static void Main(string[] args)
{
PersonRepository d = new PersonRepository();
// Returns "test1"
Console.WriteLine(((IRepository<Employee>)d).GetAll()[0]);
// Returns "test2"
Console.WriteLine(((IRepository<Student>)d).GetAll()[0]);
// Returns 42
Console.WriteLine(((IRepository<Other>)d).GetAll()[0]);
Console.ReadLine();
}
}
}
如您所见,您必须显式转换您的类,以便您的应用程序知道GetAll()
要调用哪个方法。
这对我来说听起来像是一种有缺陷的设计方法,并且是不可能的,因为方法不能仅因返回类型而异,并且该语言不支持这种方式的类型参数列表。
您可以实现一个通用基类并将它们存储在基类的列表中 ( List<Person> personRepository;
)。然后使用 Linq 扩展来获取给定类型的成员很简单,即List<Students> = personRepository.OfType<Student>().ToList();
.
不,一点也不,但你可以这样做:
// base interface for entity types
interface IEntity
{
}
class Employees : IEntity
{
}
class Students : IEntity
{
}
interface IRepository<T1, T2> where T1:IEntity where T2:IEntity
{
T1 GetAll();
T2 GetAll();
}
class PersonRepository : IRepository<Employees,Students>
{
Employees GetAll();
Students GetAll();
}
不幸的是,类型参数的数量不能动态变化。
或者,您可以这样做:
// base interface for entity types
interface IEntity
{
}
class Employees : IEntity
{
}
class Students : IEntity
{
}
interface IRepository
{
RegisterEntities(IEnumerable<IEntity> entities);
IEnumerable<IEntity> GetAll();
}
class PersonRepository : IRepository
{
IEnumerable<IEntity> GetAll()
{
// Todo
}
}
这意味着您可以将员工和学生添加到同一个存储库,因为它们共享一个基本界面。稍后您可以提取它们并将常用字段放在 IEntity 上(例如姓名、年龄)以便于访问。