Проверка в доменном управляемом дизайне

Лучше всего использовать операторы interval и switchMap.

Сначала верните наблюдаемое из функции refreshToken. Используйте оператор map для выполнения всех других вещей, таких как преобразование данных, сохранение в localalstorage и т. Д. В методе refreshToken().


import { interval, pipe } from 'rxjs'; 
import { map, switchMap } from 'rxjs/operators';

.....

refreshToken(token: string) {
   const tokenJson: any = {'token': token};
   return this.http.post('/api-token-refresh/', tokenJson,   httpOptions);
};

checkingTokenOnInterval(){
     const intervalTime = 4*60*1000;
     const token = 'sdfsdf';
     interval(intervalTime).pipe(switchMap(() => this.refreshToken(token))).subscribe(()=>{
                 //do something 
     });
}

Используйте checkingTokenOnInterval() для вызова вызова refreshToken каждые 4 минуты.

60
задан Viktor Dahl 1 August 2014 в 12:18
поделиться

3 ответа

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

public interface IValidator<T>
{
    bool IsValid(T entity);
    IEnumerable<string> BrokenRules(T entity);
}

public class OrderPersistenceValidator : IValidator<Order>
{
    public bool IsValid(Order entity)
    {
        return BrokenRules(entity).Count() == 0;
    }

    public IEnumerable<string> BrokenRules(Order entity)
    {
        if (entity.Id < 0)
            yield return "Id cannot be less than 0.";

        if (string.IsNullOrEmpty(entity.Customer))
            yield return "Must include a customer.";

        yield break;
    }
}
38
ответ дан 24 November 2019 в 17:49
поделиться

Вместо того, чтобы полагаться IsValid(xx) вызовы на всем протяжении Вашего приложения, рассмотрите слушать некоторый совет от Greg Young:

никогда не позволяют Вашим объектам войти в недопустимое состояние.

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

Рассматривают пример адреса человека:

 person.Address = "123 my street";
 person.City = "Houston";
 person.State = "TX";
 person.Zip = 12345;

Между любым из тех вызовов Ваш объект недопустим (потому что у Вас были бы свойства, которые не соглашаются друг с другом. Теперь рассмотрите это:

person.ChangeAddress(.......); 

все вызовы, касающиеся поведения изменения адреса, являются теперь атомарной единицей. Ваш объект никогда не недопустим здесь.

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

Для хорошего обсуждения этого, проверьте это интервью infoq: http://www.infoq.com/interviews/greg-young-ddd

56
ответ дан Ben Scheirman 24 November 2019 в 17:49
поделиться

Я обычно использую класс спецификации, он предоставляет метод (это - C#, но можно перевести его на любом языке):

bool IsVerifiedBy(TEntity candidate)

Этот метод выполняет полную проверку кандидата и ее отношений. Можно использовать аргументы в классе спецификации для создания, он параметризовал, как уровень проверки...

можно также добавить метод для знания, почему кандидат не проверил спецификацию:

IEnumerable<string> BrokenRules(TEntity canditate) 

можно просто решить реализовать первый метод как это:

bool IsVerifiedBy(TEntity candidate)
{
  return BrokenRules(candidate).IsEmpty();
}

Для нарушенных правил, я обычно пишу итератор:

IEnumerable<string> BrokenRules(TEntity candidate)
{
  if (someComplexCondition)
      yield return "Message describing cleary what is wrong...";
  if (someOtherCondition) 
      yield return
   string.Format("The amount should not be {0} when the state is {1}",
        amount, state);
}

Для локализации, необходимо использовать ресурсы, и почему бы не передать культуру методу BrokenRules. Я помещаю это классы в образцовое пространство имен с именами, которые предлагают их использование.

6
ответ дан thinkbeforecoding 24 November 2019 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: