通用实体库 Class
Generic Entity Base Class
我刚刚阅读了一篇关于通用实体库 类 的 post。简单地说,如果我没记错的话,背后的主要思想是在一个接口中收集所有通用的、非实体特定的字段,而不是在主要实体中实现它。这将是 TL:DR;让我们看一些代码。
这是基本实体接口,它是对另一个接口的通用实现
public interface IEntity : IModifiableEntity
{
object Id { get; set; }
DateTime CreatedDate { get; set; }
DateTime? ModifiedDate { get; set; }
string CreatedBy { get; set; }
string ModifiedBy { get; set; }
byte[] Version { get; set; }
}
public interface IEntity<T> : IEntity
{
new T Id { get; set; }
}
这是它在抽象中的实现 class
public abstract class Entity<T> : IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
object IEntity.Id
{
get { return this.Id; }
}
public string Name { get; set; }
private DateTime? createdDate;
[DataType(DataType.DateTime)]
public DateTime CreatedDate
{
get { return createdDate ?? DateTime.UtcNow; }
set { createdDate = value; }
}
[DataType(DataType.DateTime)]
public DateTime? ModifiedDate { get; set; }
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}
看起来非常清楚易懂,但关于 Id 的一点。
我的问题是(是的,终于)
为什么我们在IEntity和IEntity接口中有两个不同的Id属性?
new 关键字在那里做什么?
这是怎么回事? :O
为什么我们在 IEntity 和 IEntity 接口中有两个不同的 Id 属性?
IEntity 派生自 IEntity,但允许您传递您希望 Id 属性 成为的特定类型。基本接口定义 IEntity 的 Id 属性 定义为一个对象,它不是类型安全的,如果在 Entity Framework 中使用,将不会转换为数据库友好的数据类型。
new 关键字在那里做什么?这是怎么回事? :O
属性 定义的新关键字使代码更易于阅读和理解。由于 IEntity 定义了一个 属性 命名的 Id,它隐藏了基本实现 IEntity.Id。 "new" 关键字更容易理解 IEntity.Id 隐藏了 IEntity.Id
的基本实现
再远一点
在实体的基本抽象 class 的派生 classes 中,您将提供 ID 属性 的类型,如下所示:
public class DerivedEntity : Entity<int>
{
public string AnotherProperty { get; set; }
}
这通过 Entity 的类型参数 "T" 告诉编译器 Id 属性 是 "int" 类型,从而更易于使用和理解 Id 属性 应该在你派生的 classes.
我刚刚阅读了一篇关于通用实体库 类 的 post。简单地说,如果我没记错的话,背后的主要思想是在一个接口中收集所有通用的、非实体特定的字段,而不是在主要实体中实现它。这将是 TL:DR;让我们看一些代码。
这是基本实体接口,它是对另一个接口的通用实现
public interface IEntity : IModifiableEntity
{
object Id { get; set; }
DateTime CreatedDate { get; set; }
DateTime? ModifiedDate { get; set; }
string CreatedBy { get; set; }
string ModifiedBy { get; set; }
byte[] Version { get; set; }
}
public interface IEntity<T> : IEntity
{
new T Id { get; set; }
}
这是它在抽象中的实现 class
public abstract class Entity<T> : IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
object IEntity.Id
{
get { return this.Id; }
}
public string Name { get; set; }
private DateTime? createdDate;
[DataType(DataType.DateTime)]
public DateTime CreatedDate
{
get { return createdDate ?? DateTime.UtcNow; }
set { createdDate = value; }
}
[DataType(DataType.DateTime)]
public DateTime? ModifiedDate { get; set; }
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
[Timestamp]
public byte[] Version { get; set; }
}
看起来非常清楚易懂,但关于 Id 的一点。 我的问题是(是的,终于)
为什么我们在IEntity和IEntity接口中有两个不同的Id属性?
new 关键字在那里做什么? 这是怎么回事? :O
为什么我们在 IEntity 和 IEntity
IEntity
new 关键字在那里做什么?这是怎么回事? :O
属性 定义的新关键字使代码更易于阅读和理解。由于 IEntity
再远一点
在实体的基本抽象 class 的派生 classes 中,您将提供 ID 属性 的类型,如下所示:
public class DerivedEntity : Entity<int>
{
public string AnotherProperty { get; set; }
}
这通过 Entity