(local directory)/site-packages/toolkit
имеют __init__.py
?
Для создания импорта обход через каталоги каждый каталог должен иметь __init__.py
файл.
Во-первых, я не думаю, что вам следует использовать исключения для обработки «нормальной» бизнес-логики, такой как проверка дублирующихся адресов электронной почты. Это хороший анти-шаблон документа, и его лучше избегать. Сохраняйте ограничения для БД и обрабатывайте любые повторяющиеся исключения, потому что их невозможно избежать, но постарайтесь свести их к минимуму, проверив. Я бы не рекомендовал блокировать таблицу.
Во-вторых, вы добавили тег 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;
}
}
Это позволяет вам немного разделить обязанности и использовать службу домена для координации вещей. Надеюсь, это поможет!
Если вы правильно указали ограничения для таблицы пользователей, добавление должно выдать исключение, сообщающее вам, что уже существует повторяющееся значение. Вы можете либо перехватить это исключение в методе 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;
}
}
Учитывая, что «правило, которое пользователи отправляют по электронной почте, ДОЛЖНО быть уникальным для учетной записи», самое важное - указать в схеме базы данных, что электронная почта является уникальной, чтобы база данных INSERT завершится ошибкой, если электронное письмо будет дублироваться.
Вероятно, вы не сможете предотвратить добавление двумя пользователями одного и того же электронного письма почти одновременно, поэтому следующее: код должен (аккуратно) обработать причину ошибки INSERT, описанную выше.
После того, как вы реализовали вышеизложенное, проверять, является ли электронное письмо уникальным, прежде чем вставлять его, необязательно.