То, где проверить пользовательскую электронную почту, уже не существует?

(local directory)/site-packages/toolkit

имеют __init__.py?

Для создания импорта обход через каталоги каждый каталог должен иметь __init__.py файл.

5
задан halfer 22 February 2018 в 18:20
поделиться

3 ответа

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

Во-вторых, вы добавили тег DDD в эти вопросы, поэтому я отвечу на него в формате DDD. Мне кажется, вам нужна служба домена или фабрика. После того, как вы переместили этот код в службу или фабрику домена, вы можете внедрить в него UserRepository и позвонить ему, чтобы узнать, существует ли уже пользователь с этим адресом электронной почты.

Примерно так:

public class CreateUserService
{
private readonly IUserRepository userRepository;

public CreateUserService(IUserRepository userRepository)
{
    this.userRepository = userRepository;
}

public bool CreateUser(Account account, string emailAddress)
{
    // Check if there is already a user with this email address
    User userWithSameEmailAddress = userRepository.GetUserByEmailAddress(emailAddress);
    if (userWithSameEmailAddress != null)
    {
        return false;
    }

    // Create the new user, depending on you aggregates this could be a factory method on Account
    User newUser = new User(emailAddress);
    account.AddUser(newUser);
    return true;
}
}

Это позволяет вам немного разделить обязанности и использовать службу домена для координации вещей. Надеюсь, это поможет!

3
ответ дан 15 December 2019 в 01:08
поделиться

Если вы правильно указали ограничения для таблицы пользователей, добавление должно выдать исключение, сообщающее вам, что уже существует повторяющееся значение. Вы можете либо перехватить это исключение в методе CreateUser и вернуть null, либо какой-то повторяющийся код статуса пользователя, либо позволить ему вытечь и перехватить его позже.

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

public User CreateUser(string email)
{
    try
    {
       User user = new User(email);
       user.Account = this;
       user.Insert();
    catch (SqlException e)
    {
      // It would be best to check for the exception code from your db...
      return null;
    }
}
1
ответ дан 15 December 2019 в 01:08
поделиться

Учитывая, что «правило, которое пользователи отправляют по электронной почте, ДОЛЖНО быть уникальным для учетной записи», самое важное - указать в схеме базы данных, что электронная почта является уникальной, чтобы база данных INSERT завершится ошибкой, если электронное письмо будет дублироваться.

Вероятно, вы не сможете предотвратить добавление двумя пользователями одного и того же электронного письма почти одновременно, поэтому следующее: код должен (аккуратно) обработать причину ошибки INSERT, описанную выше.

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

0
ответ дан 15 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

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