Здесь, в моем репозитории, я использую простой список в памяти, в котором хранятся мои пользователи:
Код: Выделить всё
public ResultAdd(User user)
{
var userExists = CheckIfUserNameExists(user.GetUserName());
if (userExists)
{
var error = UserErrors.UserAlreadyExistsError(user.GetUserName());
return Result.Failure(error);
}
_users.Add(user);
return Result.Success(user.GetId());
}
Код: Выделить всё
public class Result
{
private Result(T value, bool isSuccess, Error error)
{
if(isSuccess && error != Error.None || !isSuccess && error == Error.None)
{
throw new ArgumentException("Invalid error", nameof(error));
}
IsSuccess = isSuccess;
Value = value;
Error = error;
}
public T Value { get; }
public bool IsSuccess { get; }
public Error Error { get; }
public static Result Success(T value) => new(value, true, Error.None);
public static Result Failure(Error error) => new(default!, false, error);
}
Код: Выделить всё
public Result SignUp(SignUpRequest request)
{
var user = new User(
request.FirstName,
request.LastName,
request.UserName,
request.Password
);
var idResult = _userRepository.Add(user);
return idResult.Map(id => new SignUpResponse(id));
}
Код: Выделить всё
public static Result Map(this Result result, Func mapper)
{
return result.IsSuccess
? Result.Success(mapper(result.Value))
: Result.Failure(result.Error);
}
- Функция Map скрывает тот факт, что она обрабатывает сценарии успеха и неудачи, поэтому делает код менее читабельным.
- В результатах сбоя мне все равно нужно пропустить тип T, даже если он не используется, что кажется странным
- I Могу себе представить, что по мере масштабирования это станет еще более неудобным, поскольку мне, возможно, придется продолжать картографирование в нескольких слоях.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -using-the
Мобильная версия