Базовый класс универсального объекта - PullRequest
0 голосов
/ 02 мая 2018

Я только что прочитал пост о базовых классах базовых сущностей. Просто, и если я не ошибаюсь, основная идея заключается в том, чтобы собрать все общие, не относящиеся к объектам поля в одном интерфейсе, чем реализовать его в основных объектах. Это будет 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?

  • Что здесь делает ключевое слово new ? В чем дело? : O

1 Ответ

0 голосов
/ 02 мая 2018

Почему у нас есть два разных свойства Id в интерфейсах IEntity и IEntity ?

IEntity происходит от IEntity, но позволяет вам передавать определенный тип, которым вы хотите, чтобы ваше свойство Id было. Определение базового интерфейса IEntity имеет свойство Id, определенное как объект, который не является безопасным типом и, если он используется в Entity Framework, не будет преобразован в дружественный к базе данных тип данных.

Что там делает новое ключевое слово? В чем дело? : O

Новое ключевое слово определения свойства облегчает чтение и понимание кода. Поскольку IEntity имеет свойство с именем Id, которое скрывает базовую реализацию IEntity.Id. Ключевое слово «new» облегчает понимание того, что IEntity .Id скрывает базовую реализацию IEntity.Id

.

Чуть дальше

В ваших производных классах базового абстрактного класса Entity вы предоставляете тип свойства ID следующим образом:

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

Это сообщает компилятору, что свойство Id имеет тип "int" через параметр типа "T" в Entity , что упрощает использование и понимание того, каким должно быть свойство Id в ваших производных классах.

...