这段代码中的IEntity是什么意思?它与通用存储库模式有什么关系?

3
我在几个地方看到了这段代码。在下面的代码中,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);

}

2
它作为T的限制。只有从IEntity派生的类才能用于通过泛型类创建存储库。如果您尝试使用未从IEntity派生的类创建存储库,则会收到编译器错误。 - dbugger
谢谢指出。你有什么想法为什么它会作为一个约束条件呢? - TreK
1
确保该类拥有存储库所需的一切。 - dbugger
1个回答

3
这是一个通用类型参数约束,它定义了什么类型的实体可以处理存储库。也就是说,TEntityIEntity 或任何派生类,但至少 TEntity 引用将在编译时访问 IEntity 成员。这是一个巨大的改进,因为你不需要在转换引用之前执行运行时类型检查,因为你不再需要进行强制转换。
例如,没有泛型的 Add(TEntity) 看起来像 Add(Entity),这将强制运行时执行向上转换(比如,Add(new DerivedEntity())DerivedEntity 上转换为 Entity)。
使用泛型时,一个 IRepository<DerivedEntity> 将会将 Add 编译为 Add(DerivedEntity),那么,在添加一个类型为 DerivedEntity 的实体时,现在在哪里转换类型呢? ;)
一般情况下,存储库实现应该设置 TEntity.Id
public void Add(TEntity entity)
{
    // "entity" reference can access TEntity.Id because TEntity is
    // at least IEntity
    entity.Id = Guid.NewGuid().ToString();
}

这是数据库的主键吗?例如,如果我的数据库表上有一个自增字段(称为Id),我是否可以跳过Add(TEntity entity)中的调用并在Get方法中设置它? - TreK
@TravisK 在我的情况下,我尽量避免使用标识字段,而是采用guidcomb策略,简而言之,在应用程序层中生成标识符,而不是在数据库中生成...顺便说一句,如果您使用标识,则可以跳过设置整个Id,并且所有由gets返回的对象都应该带有整个Id已经设置。 - Matías Fidemraizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接