通用实体基类

时间:2018-05-02 13:55:14

标签: c# asp.net-mvc generics base-class

我刚刚阅读了一篇关于通用实体基类的文章。简单地说,如果我没有错,后面的主要想法是在一个接口中收集所有通用的,非实体特定的字段,而不是在主要实体中实现它。它将成为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

1 个答案:

答案 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属性应该在派生类中的内容。