HashSet obiekt dodaje się poprawnie, lecz gdy chce go pobrać nie ma go w kolekcji

0

Dodaje nowego użytkownika do kolekcji. Na końcu metody Add(User user) w debugger jest dodany nowy obiekt do HashSet. Nie wyłączając aplikacji chcę pobrać dokładnie tego użytkownika. W metodzie UserDto Get(string email) _userRepository posiada już tylko 3 obiekty, dodane z "palca".
Metoda Get działa ponieważ zwraca dane dla przypisanych użytkowników.
Proszę o pomoc.



namespace Passengers.Infrastructure.Repository
{
        public  class InMemoryUserRepository : IUserRepository
    {
        private ISet<User> _users = new HashSet<User>
        {   new User("[email protected]","user1","password1","adsf213"),
            new User("[email protected]","user2","password2","adsf213"),
            new User("[email protected]","user3","password3","adsf213"),
        };
    
    public void Add(User user)
            {
            _users.Add(user);
            }

    public User Get(string email)
           =>_users.SingleOrDefault(x => x.Email==email.ToLowerInvariant());

    }
}

namespace Passengers.Infrastructure.Services
{
        public class UserServices : IUserService
    {
        private readonly IUserRepository _userRepository;
        private readonly IMapper _mapper;
        public UserServices(IUserRepository userRepository,IMapper mapper)
        {
            _mapper = mapper;
            _userRepository = userRepository;
        }

        public UserDto Get(string email)
        {
            var User = _userRepository.Get(email);
            return _mapper.Map<User, UserDto>(User);
            
        }

        public void Register(string email,string username,string password)
        {
            var user = _userRepository.Get(email);
            if(user != null)
            {
                throw new Exception($"User with email{email} already exist");
            }
            string salt = Guid.NewGuid().ToString("N");
            user = new User(email,username,password,salt);
                _userRepository.Add(user);
        }
        
        
    }
}

2

Jesteś pewien, że metoda public User Get(string email) działa dla każdego przypadku? Jeśli zapisz adres email z lower i upper case, np. [email protected] to porownanie:
[email protected] == "[email protected]".ToLowerInvariant() zwróci false. Zamieniłbym to na: x.Email.Equals(email, StringComparison.OrdinalIgnoreCase) aby nie przejmować się w jakiej postaci email został zapisany i w jakiej został dostarczony parametr wejściowy

1

Obstawiam że dla każdego requesta masz tworzony nowy obiekt InMemoryUserRepository, aby uzyskać to co chcesz:

  • w konfiguracji DI zmieniasz z Scoped na Singleton, dla InMemoryUserRepository
  • albo dodajesz modyfikator static do pola ISet<User> _users.
0
neves napisał(a):

Obstawiam że dla każdego requesta masz tworzony nowy obiekt InMemoryUserRepository, aby uzyskać to co chcesz:

  • w konfiguracji DI zmieniasz z Scoped na Singleton, dla InMemoryUserRepository
  • albo dodajesz modyfikator static do pola ISet<User> _users.

Dzięki. Dodałem modyfikator i śmiga. Tzn że bez static, każde _user.Add() Tworzyło nową kolekcje dla każdego utworzonego Usera ?

0
Grzegorz Kotfis napisał(a):

Jesteś pewien, że metoda public User Get(string email) działa dla każdego przypadku? Jeśli zapisz adres email z lower i upper case, np. [email protected] to porownanie:
[email protected] == "[email protected]".ToLowerInvariant() zwróci false. Zamieniłbym to na: x.Email.Equals(email, StringComparison.OrdinalIgnoreCase) aby nie przejmować się w jakiej postaci email został zapisany i w jakiej został dostarczony parametr wejściowy

Tak bo w konstruktorze, przed zapisem także używam .ToLowerIvariant().
Edit:
Ale masz racje, mniej do walidacji.

0
kalafaktor napisał(a):

Dzięki. Dodałem modyfikator i śmiga. Tzn że bez static, każde _user.Add() Tworzyło nową kolekcje dla każdego utworzonego Usera ?

Każde UserService dostaje nową instancję InMemoryUserRepository, więc każde pole niestatyczne też jest nowe.

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