这个代码中的IEntity对于通用存储库模式是什么?

时间:2016-01-13 13:19:57

标签: generics design-patterns interface repository-pattern

我在几个地方看到过这段代码。 IEntity在下面的代码中做了什么?我知道IEntity不是一个界面,即使它以" I"为前缀。另外,据我所知,它可能充当从存储库返回的实体的ID。该ID何时设定?我正在寻找IEntity界面使用的良好探索以及它与" T"的关系。

代码来自:http://blog.falafel.com/implement-step-step-generic-repository-pattern-c/

public class IEntity
{
    public string Id; 
}

public interface IRepository<T> where T: IEntity
{

    IEnumerable<T> List { get; }
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    T FindById(int Id);

}

1 个答案:

答案 0 :(得分:2)

这是一个泛型类型参数约束,用于定义哪种类型的实体可以处理存储库。

也就是说,TEntityIEntity或任何派生类,但至少TEntity个引用将获得对IEntity成员的编译时访问权限。这是一个巨大改进,因为您不需要在转换引用之前执行运行时类型检查,因为您不再需要强制转换。

例如,没有泛型的Add(TEntity)看起来会Add(Entity)迫使运行时执行 upcast (fe Add(new DerivedEntity())向上转发DerivedEntityEntity)。

使用泛型时,IRepository<DerivedEntity>会将Add编译为Add(DerivedEntity),因此,在添加DerivedEntity类型的实体时,现在是哪个演员?< / em>;)

  

何时设置此ID?

通常,存储库实现应设置TEntity.Id

public void Add(TEntity entity)
{
    // "entity" reference can access TEntity.Id because TEntity is
    // at least IEntity
    entity.Id = Guid.NewGuid().ToString();
}