3

我想创建一个界面,例如...

interface IRepository<params T>
{
    T GetAll();
}

class PersonRepository : IRepository<Employees,Students>
{
    Employees GetAll();
    Students GetAll();
}

很清楚,我知道具体的实现是不可能的,但是有没有办法采用多实体存储库并创建一些超级基础接口?

4

3 回答 3

6

这是可能的:

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()要调用哪个方法。

于 2012-07-30T16:29:15.420 回答
0

这对我来说听起来像是一种有缺陷的设计方法,并且是不可能的,因为方法不能仅因返回类型而异,并且该语言不支持这种方式的类型参数列表。

您可以实现一个通用基类并将它们存储在基类的列表中 ( List<Person> personRepository;)。然后使用 Linq 扩展来获取给定类型的成员很简单,即List<Students> = personRepository.OfType<Student>().ToList();.

于 2012-07-30T16:50:47.673 回答
-2

不,一点也不,但你可以这样做:

// 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 上(例如姓名、年龄)以便于​​访问。

于 2012-07-30T16:19:39.423 回答