generics - 通用存储库模式的此代码中的 IEntity 是什么?

标签 generics design-patterns interface repository-pattern

我在几个地方看到过这段代码。 IEntity 在下面的代码中做了什么?我知道 IEntity 不是接口(interface),即使它以“I”为前缀。此外,我知道它可能充当从存储库返回的实体的 ID。什么时候设置这个ID?我正在寻找 IEntity 的接口(interface)使用及其与“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);

}

最佳答案

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

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

例如,Add(TEntity)没有泛型看起来像 Add(Entity)这将强制运行时执行向上转换(例如 Add(new DerivedEntity())DerivedEntity 向上转换为 Entity)。

使用泛型时,IRepository<DerivedEntity>将编译 Add作为Add(DerivedEntity) ,所以,添加类型为 DerivedEntity 的实体时,现在的转换在哪里? ? ;)

When would this ID be set?

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

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

关于generics - 通用存储库模式的此代码中的 IEntity 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767802/

相关文章:

ios - Swift 泛型函数问题。减少重复代码

r - 在 R 中,如何从另一个包中的一个包扩展泛型方法?

java - 每个处理程序都可以处理责任链模式中的请求吗?

java - 我可以并且是否需要避免单例模式?

angular - 接口(interface)对象属性未定义,但有 Angular 值

delphi - 向非接口(interface)派生对象添加接口(interface)

c# - 何时使用非泛型接口(interface)作为泛型类型约束

c# - 通用类派生约束的首选语法是什么?

iphone - 为什么 UITableView 对其委托(delegate)和数据源进行如此多的调用?

java - 绑定(bind)同一个接口(interface)两次(Guice)