我在几个地方看到过这段代码。 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);
}
最佳答案
它是一个泛型类型参数约束,用于定义什么类型的实体可以处理存储库。
即TEntity
是IEntity
或任何派生类,但至少 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/