我刚刚读了一篇关于通用实体基类的文章。简单来说,如果我没有理解错的话,其主要思想是将所有通用、非实体特定的字段收集到一个接口中,然后在主实体中实现它。这篇文章有点长,让我们看一些代码。
以下是基本实体接口及其通用实现的另一个接口:
这是它实现为一个抽象类的例子。
以下是基本实体接口及其通用实现的另一个接口:
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; }
}
这是它实现为一个抽象类的例子。
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
object
类型,而另一个则是特定的T
类型。你需要使用new
,因为它属于不同的类型,并且你希望覆盖继承声明。如果通过该接口访问实例,则Entity<T>
还明确地实现了非泛型的Id
。 - AndrewIEntity<T>
,那么就不需要使用object Id
。虽然你可以这样做,但这可能没有意义。 - Andrew