我在几个地方看到过这段代码。 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);
}
答案 0 :(得分:2)
这是一个泛型类型参数约束,用于定义哪种类型的实体可以处理存储库。
也就是说,TEntity
是IEntity
或任何派生类,但至少TEntity
个引用将获得对IEntity
成员的编译时访问权限。这是一个巨大改进,因为您不需要在转换引用之前执行运行时类型检查,因为您不再需要强制转换。
例如,没有泛型的Add(TEntity)
看起来会Add(Entity)
迫使运行时执行 upcast (fe Add(new DerivedEntity())
向上转发DerivedEntity
到Entity
)。
使用泛型时,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();
}