DDD i sterowanie przepływem przez wyjątki

0

Tak jak patrzę, to @neves ma dużo racji. Nie widziałem jeszcze na GitHubie żadnego projektu w DDD (.NET), w którym zwracano by Result/Either zamiast rzucano wyjątkami. Może po prostu wyjątki pasują lepiej, gdy ma się kilka warstw? Ostatnio ktoś wrzucił przykładowy projekt w Springu z RDM: Spring clean architecture Wygląda to bardzo fajnie, tylko że autor użył VAVR i zmienił wiodący paradygmat całego systemu. Jeśli by chcieć coś takiego zrobić w C#, to trzeba by zaciągnąć language-ext, bo chyba pisanie tych wszystkich monad samemu nie ma sensu. Tylko że tego chyba nikt w Polsce nie używa i korzystanie z tego nie jest proste. Jak żyć? :(

EDIT: Kamil Grzybek, którego artykuł był tu linkowany, pisze modularny monolit w DDD: https://github.com/kgrzybek/modular-monolith-with-ddd ;) Jak patrzę na poziom skomplikowania, to zaczynam żałować, że nie wybrałem innego zawodu...

0

Na pałę zrobiłem sobie coś takiego. Nie powiem: wygląda fajnie, ale czy warto? Tu zamiast serwisów wywołuję prywatne metody (w tej sytuacji kod niewiele wnosi), ale przy serwisach wyglądałoby to podobnie.

protected override EitherAsync<ErrorCode, CurrentUserDto> Handle(Login command)
        {
            OptionAsync<User> user = _userManager.FindByNameAsync(command.UserName);
            return user
                .ToEither(ErrorCode.UserNotFound)
                .BindAsync(CheckIfEmailConfirmed)
                .BindAsync(u => CheckPassword(u, command.Password))
                .Map(MapToDto);
        }

        private CurrentUserDto MapToDto(User user)
        {
            return new CurrentUserDto
            {
                UserId = user.Id,
                UserName = user.UserName,
                Token = _tokenProvider.GenerateJwtToken(user.Id, user.UserName, 0)
            };
        }

        private async Task<EitherAsync<ErrorCode, User>> CheckIfEmailConfirmed(User user)
        {
            var isConfirmed = await _userManager.IsEmailConfirmedAsync(user);
            if (!isConfirmed) return ErrorCode.EmailNotConfirmed; // nie dało się użyć ternary operator
            return user;
        }

        private async Task<EitherAsync<ErrorCode, User>> CheckPassword(User user, string password)
        {
            var isCorrect = await _userManager.CheckPasswordAsync(user, password);
            if (!isCorrect) return ErrorCode.PasswordNotCorrect;
            return user;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1