使用通用接口存储库

时间:2012-05-11 02:52:40

标签: c# .net

我的存储库设置如下所示。

interface IRepository<T> where T : DataRow
{
  T Get(int key);
}

interface ICartonRepository : IRepository<CartonDataRow>
{

}

class CartonRepository : ICartonRepository
{
  public CartonDataRow Get(int key)
  {

  }
}

我还有一个PackRepository,其定义方式与CartonRepository相同。我想做的是以下内容。

IRepository<DataRow> repository;
switch (rowType)
{
  case Carton:
    repository = new CartonRepository();
    break;
  case Pack:
    repository = new PackRepository();
    break;
}

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:0)

interface IRepository<out T> where T : DataRow
{
  T Get(int key);
}

这需要C#4.0。

答案 1 :(得分:0)

您需要某种Factory pattern

以下逻辑应该转到工厂类

class RepositoryFactory
{
    IRepository<T>  Get(rowType)
    {
        IRepository<T> repository = default(IRepository<T>);
        switch (rowType)
        {
        case Carton:
            repository = new CartonRepository();
            break;
        case Pack:
            repository = new PackRepository();
            break;
        }

        return repository;
    }
}

您可以使用Dependency Injection或基于维护dictionary.

中的所有存储库来进一步改进获取方法

答案 2 :(得分:0)

对于C#3.5,您必须添加以下内容:

public interface IRepository {
   DataRow Get(int key);
}

public abstract class Repository<T> : IRepository<T>, IRepository
    where T : DataRow
{
   public abstract T Get(int key);

   DataRow IRepository.Get(int key) {
       return this.Get(key);
   }
}

然后将CartonRepository更改为class CartonRepository : Repository<CartonDataRow>(我认为您不需要ICartonRepository,但如果您愿意,可以使用它)。然后

IRepository repository;
switch (rowType)
{
  case Carton:
    repository = new CartonRepository();
    break;
  case Pack:
    repository = new PackRepository();
    break;
}