【问题标题】:IRepository vs. IRepository<T>IRepository 与 IRepository<T>
【发布时间】:2011-04-22 03:39:27
【问题描述】:

我正在尝试为我的所有存储库实现定义一个特定接口,而不仅仅是这样:

public abstract class GeneralizedRepository
{
    readonly IDataModel _Model;

    public GeneralizedRepository(IDataModel Model) {
        if (Model == null)
            throw new NullReferenceException();
        _Model = Model;
    }

    public IDataModel DataModel { get { return _Model; } }

    public abstract IEnumerable<T> GetAll<T>();
    public abstract T GetOne<T>(Func<T, bool> predicate);

    public abstract bool Contains<T>(Func<T, bool> predicate);
    public abstract void Add<T>(T entity);
    public abstract void Update<T>(T entity);
    public abstract bool Remove<T>(Func<T, bool> predicate);
}

这是一个类,因为我的派生存储库具有共同的实例 DataModel

现在我有具体的实现:

public class DetailRep : GeneralizedRepository
{
    public DetailRep(IDataModel Model) : base(Model) { }
    public DetailRep(UnitOfWork Unit) : base(Unit.Model) { }

    public override IEnumerable<T> GetAll<T>() {
        throw new NotImplementedException();
    }

    public override T GetOne<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }

    public override bool Contains<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }

    public override void Add<T>(T entity) {
        throw new NotImplementedException();
    }

    public override void Update<T>(T entity) {
        throw new NotImplementedException();
    }

    public override bool Remove<T>(Func<T, bool> predicate) {
        throw new NotImplementedException();
    }
}

但它是一个Detail Repository,我的意思是我想替换所有T类型的Detail

但是编译时抛出错误:

类型参数声明必须是标识符而不是类型

【问题讨论】:

  • 题目中的类型根本没有出现在题目中!?你能再检查一下你的问题吗?并提供有关错误的更多详细信息。例如产生错误的行?对 base(...) 的调用是错误的,但在解释之前,我首先需要了解您真正想要的是什么。

标签: .net generics repository


【解决方案1】:

将您的抽象类声明为泛型:

public abstract class GeneralizedRepository<T>
{
    readonly IDataModel _model;
    public GeneralizedRepository(IDataModel model)
    {
        if (model == null)
            throw new NullReferenceException();
        _model = model;
    }
    public IDataModel DataModel { get { return _model; } }
    public abstract IEnumerable<T> GetAll();
    public abstract T GetOne(Func<T, bool> predicate);
    public abstract bool Contains(Func<T, bool> predicate);
    public abstract void Add(T entity);
    public abstract void Update(T entity);
    public abstract bool Remove(Func<T, bool> predicate);
}

然后在您的派生类上用您的Detail 填写类型:

public class DetailRep  : GeneralizedRepository<Detail>
{
    public DetailRep(IDataModel model)
        : base(model)
    {
    }
    public override IEnumerable<Detail> GetAll(){}
    public override Detail GetOne(Func<Detail, bool> predicate){}
    public override bool Contains(Func<Detail, bool> predicate){}
    public override void Add(Detail entity){}
    public override void Update(Detail entity){}
    public override bool Remove(Func<Detail, bool> predicate){}
}

【讨论】:

  • 但是这样如果我有 10 个存储库,并且每个存储库都实现 GeneralizedRepository,其中 T 是存储库包含的内容类型,编译器将生成 GeneralizedRepository、GeneralizedRepository, .... GeneralizedRepository。我只想要一个抽象类和 10 个派生类。
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多