Приложение с действием в определенное время - PullRequest
0 голосов
/ 05 июня 2018

Предположим, у меня есть модель

public class SomeModel
{
    public DateTime StartDate { get; set; }
    public bool IsActive { get; set; }
}

Мой вопрос: как лучше всего поменять атрибут IsActive на true, когда наступит время, определенное в StartDate?Должен ли я использовать делегаты / события или таймер?Буду благодарен за небольшой пример.

Ключевым моментом является то, что IsActive хранится в базе данных, поэтому при его изменении я хотел бы обновить модель в БД.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Сделать IsActive расчетным свойством.

public class SomeModel
{
    public DateTime StartDate { get; set; }
    public bool IsActive
    {
        get { return DateTime.Now >= StartDate; }
    }

}
0 голосов
/ 05 июня 2018

Было бы лучше использовать свойство, которое описывают другие ответы.В вашей базе данных не должно быть столбца для IsActive, так как его можно легко рассчитать.При этом, если вам нужно обрабатывать обновления в вашей БД, как вы просите, вам понадобится что-то вроде следующего:

Вы должны не делать это из ваших действий, как это будетзадержать ответ клиенту, вероятнее время ожидания и потреблять ресурсы.

Вероятно, вам нужен планировщик, который выполняет обновления БД во время работы вашего основного приложения .net.Поскольку вы не можете полагаться на то, что это происходит постоянно, вам также потребуется обрабатывать их при запуске.

Рассмотрите планировщик, подобный этому - Hangfire - FluentScheduler

Определите эту функцию:

void UpdateActiveInDatabase(MyDbContext myDb){
    var models = myDb.myModels.Where(model => !model.IsActive && model.StartDate <= DateTime.UtcNow); //These models should be active
    foreach(var model in models) { model.IsActive = true; }
    myDb.SaveChanges();
}

Затем, когда ваше приложение запустится:

var myDb = GetMyDb(); // Get a DbContext instance from your DI somewhere
UpdateActiveInDatabase();

var models = myDb.myModels.Where(model => model.StartDate > DateTime.UtcNow); //These models need to be updated in the future
foreach(var model in models){
    // Dependent on the scheduler you pick. Will need to get a DbContext from your DI and call UpdateActiveInDatabase(myDb);
}

И каждый раз, когда в вашей таблице происходит обновление сущностей, вытакже необходимо UpdateActiveInDatabase(myDb);

0 голосов
/ 05 июня 2018

Таймер не требуется, потому что вам не нужно ничего устанавливать.Просто напишите свойство, которое вычисляет IsActive.

public class SomeModel
{
    public DateTime StartDate { get; set; }
    [NotMapped]
    public bool IsActive { get; } => DateTime.UtcNow >= StartDate;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...