Шаблон нулевого объекта на _base_ значениях - PullRequest
0 голосов
/ 20 апреля 2020

Допустим, у нас есть следующий объект DTO, который является представлением записи в базе данных:

public class UserDto
{
  public int Id { get; set; }  
  public DateTime? ExpireOn { get; set; }
}

Таким образом, свойство Id не имеет значения NULL и ExpireOn равно. У меня проблема с реализацией объектов Domain на основе Null Object Pattern, потому что я не знаю, как реализовать свойство ExpireOn, не обнуляемое. Каковы лучшие практические способы сделать это?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вы можете использовать Nullable в Ctor и проверить, есть ли значение NULL или нет.

public class User
{
    public User(int? id, Datetime? expireOn)
    {
        if(id == null)
        {
           throw new ArgumentNullException(nameof(id));
        }

        if(expireOn == null)
        {
           throw new ArgumentNullException(nameof(expireOn));
        }

        Id = id.Value
        ExpireOn = expireOn.Value;
    }

    public int Id { get; set; }
    public Datetime ExpireOn { get; set; }
}
0 голосов
/ 20 апреля 2020

Я придумал это решение:

public abstract class ExpirationTimeBase
{
    public static ExpirationTimeBase NoExpiration = new NoExpirationTime();
    public abstract bool IsExpired(DateTime now);
}
public class ExpirationTime : NoExpirationTime
{
    public ExpirationTime(DateTime time) => Time = time;
    public DateTime Time { get; }
    public override bool IsExpired(DateTime now) => this.Time < now;
}

public class NoExpirationTime : ExpirationTimeBase
{
    public override bool IsExpired(DateTime now) => false;
}

public class User
{
    public User(string id, ExpirationTimeBase expireOn)
    {
        Id = id ?? throw new ArgumentNullException(nameof(id));
        ExpireOn = expireOn ?? throw new ArgumentNullException(nameof(expireOn));
    }

    public string Id { get; set; }
    public ExpirationTimeBase ExpireOn { get; set; }
}

Вопрос в том, может ли он стать лучше?

...