首页 > 解决方案 > 通用实体基类

问题描述

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

标签: c#asp.net-mvcgenericsbase-class

解决方案


为什么我们在 IEntity 和 IEntity<T> 接口中都有两个不同的 Id 属性?

IEntity<T> 派生自 IEntity,但允许您传递您希望 Id 属性成为的特定类型。基本接口定义 IEntity 将 Id 属性定义为对象,该对象不是类型安全的,如果在 Entity Framework 中使用,则不会转换为数据库友好的数据类型。

new 关键字在那里做什么?这是怎么回事?:O

属性定义的 new 关键字使代码更易于阅读和理解。由于 IEntity<T> 定义了一个名为 Id 的属性,该属性隐藏了基本实现 IEntity.Id。“new”关键字更容易理解 IEntity<T>.Id 隐藏了 IEntity.Id 的基本实现

再远一点

在 Entity 的基本抽象类的派生类中,您将提供 ID 属性的类型,如下所示:

public class DerivedEntity : Entity<int>
{
    public string AnotherProperty { get; set; }
}   

这通过 Entity<T> 的类型参数“T”告诉编译器 Id 属性是“int”类型,从而更容易使用和理解派生类中的 Id 属性应该是什么。


推荐阅读