我刚刚阅读了一篇关于通用实体基类的文章。简单地说,如果我没有错,后面的主要想法是在一个接口中收集所有通用的,非实体特定的字段,而不是在主要实体中实现它。它将成为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属性?
新关键字在那里做什么? 发生了什么事? :0
答案 0 :(得分:2)
为什么我们在IEntity和IEntity中都有两个不同的Id属性&lt; T&gt;接口吗
IEntity&LT; T&GT;派生自IEntity,但允许您传递您希望Id属性的特定类型。基本接口定义IEntity将Id属性定义为一个对象,它不是类型安全的,如果在Entity Framework中使用,则不会转换为数据库友好的数据类型。
新关键字在那里做什么?这是怎么回事? :0 强>
属性定义的新关键字使代码更易于阅读和理解。由于IEntity&lt; T&gt;有一个名为Id的属性已定义隐藏基本实现IEntity.Id。 “new”关键字使我们更容易理解IEntity&lt; T&gt; .Id隐藏了IEntity的基本实现.Id
再远一点
在Entity的基本抽象类的派生类中,您将提供ID属性的类型,如下所示:
public class DerivedEntity : Entity<int>
{
public string AnotherProperty { get; set; }
}
这通过实体&lt; T&gt;的类型参数“T”告诉编译器Id属性的类型为“int”。更容易使用和理解Id属性应该在派生类中的内容。