【发布时间】:2018-10-12 16:00:27
【问题描述】:
我刚刚阅读了一篇关于通用实体基类的文章。简单地说,如果我没记错的话,后面的主要思想是在一个接口中收集所有通用的、非实体特定的字段,而不是在主要实体中实现它。这将是一个 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; }
}
这是抽象类的实现
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,以防通过该接口访问实例。 -
但所有具体实体都派生自Entity抽象类并使用通用ID属性生成一个。所以对象 ID 是多余的,不是吗?
-
如果您使用的是
IEntity<T>,您将不会使用object Id。你可以,但这样做可能没有意义。
标签: c# asp.net-mvc generics base-class