Правильный способ написания одного универсального метода для двух похожих методов? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть 2 модели (EndUser и EndUserServicesDTO имеют похожую логику, но существуют на двух разных уровнях)

public class EndUserServicesDTO
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string Role { get; set; }
    public string Password { get; set; }
    public string RetypePassword { get; set; }
}

public class AppDeveloperServicesDTO : EndUserServicesDTO
{
    public string CompanyName { get; set; }
    public string CompanyAdress { get; set; }
    public string CompanyEmail { get; set; }
    public string CompanyPhoneNumber { get; set; }
    public string CompanyWebSite { get; set; }
}

и у меня есть 2 метода в разных репозиториях

  private readonly IMongoUOWRepositoryGeneric<EndUser> _userManager;

 public async Task<bool> AddAsync(EndUserServicesDTO userServicesDTO)
    {
        EndUser user = _mapper.Map<EndUser>(userServicesDTO);

        user.PasswordHash = PBKDF2Hasher.HashPassword(userServicesDTO.Password);

        await _userManager.Clients.AddAsync(user);

        return true;
    }



 private readonly IMongoUOWRepositoryGeneric<AppDeveloper> _developerManager;

public async Task<bool> AddAsync(AppDeveloperServicesDTO developerServicesDTO)

    {
        AppDeveloper developer = _mapper.Map<AppDeveloper>(developerServicesDTO);

        developer.PasswordHash = PBKDF2Hasher.HashPassword(developerServicesDTO.Password);

        await _developerManager.Clients.AddAsync(developer);

        return true;
    }

оба метода имеют одинаковую функциональность для добавления, но используются для разных моделей. Не могли бы вы мне посоветовать написать один и тот же универсальный метод для того, чтобы помнить точный сценарий?

Что я пробовал до сих пор

ведет к классу EndUser, но если я это сделаю, я удаляю свойства компании в Developer model и сохраняю их без него, в противном случае я не могу использовать .PasswordHash для свойства Password и понятия не имею Как сделать это с помощью универсального метода.

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Все изменения должны быть такими:

 public async Task<bool> AddAsync<T>(T dto) where T : IPassword        
 {
     var data = _mapper.Map<T>(dto);

     data.PasswordHash = PBKDF2Hasher.HashPassword(data.Password);

     await _developerManager.Clients.AddAsync(data);

     return true;
  }

  public interface IPassword 
  {
     string Password { set; get; }
     string PaswordHash { set; get; }  
  }

  public class EndUserServicesDTO : IPassword
  {
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string Email { get; set; }
     public string PhoneNumber { get; set; }
     public string Role { get; set; }
     public string Password { get; set; }
     public string RetypePassword { get; set; }
    }

    public class AppDeveloperServicesDTO : EndUserServicesDTO, IPassword
    {
        public string CompanyName { get; set; }
        public string CompanyAdress { get; set; }
        public string CompanyEmail { get; set; }
        public string CompanyPhoneNumber { get; set; }
        public string CompanyWebSite { get; set; }
    }

Новая версия на основе новых требований:

 public class ClientRepository<T> 
    {
        private readonly IMongoUOWRepositoryGeneric<T> _manager;
        readonly IMapper _mapper;

        public ClientRepository(IMongoUOWRepositoryGeneric<T> manager, IMapper mapper)
        {
            _manager = manager;
            _mapper = mapper;
        }

        public async Task<bool> AddAsync<U>(U dto) where U : IPassword
        {
            dto.PaswordHash = PBKDF2Hasher.HashPassword(dto.Password);
            T data = _mapper.Map<T,U>(dto);               

            await _manager.Clients.AddAsync(data);

            return true;
        }
    }
0 голосов
/ 10 июня 2019

Может быть, использование универсального T решит вашу проблему

public async Task<bool> AddAsync<T>(T dto)

    {
        T data = _mapper.Map<T>(dto);

        data.PasswordHash = PBKDF2Hasher.HashPassword(data.Password);

        await _developerManager.Clients.AddAsync(data);

        return true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...