Создание разных типов пользователей в Aspnetboilerplate - PullRequest
0 голосов
/ 19 марта 2019

Я использую ASP.NET Boilerplate и пытаюсь найти лучший подход к этому:

Создание разных типов пользователей (ученик, учитель, администратор) Я читаю эту ветку: https://forum.aspnetboilerplate.com/viewtopic.php?f=5&t=3213 но я немного запутался во всем процессе.

Я уже создаю сущность, которая расширяет сущность пользователя, но я не уверен, как ее использовать в службе приложений или как создать класс менеджера сущностей.

Моя первая цель состоит в том, чтобы со страницы администратора можно было добавлять / регистрировать пользователей разных типов и, возможно, разрешить этому другому типу пользователей регистрироваться самостоятельно.

Заранее спасибо ...

ОБНОВЛЕНИЕ : я тестировал и делал это, во-первых, создал другую сущность, что-то очень простое, расширяя класс User, и я просто добавил 2 свойства

public class Client : User
{
    public virtual DateTime BirthDate { get; set; }

    public virtual DateTime RegisterDate { get; set; }
}

После создания этого класса была создана миграция, очень важно проверить, что таблица AbpUsers изменена, и добавлен столбец с именем Discriminator, основанный на шаблоне TPH Entity Framework В этом столбце Discriminator, и при миграции нам нужно добавить значение по умолчанию для этого столбца, проверьте следующее изображение:

Migration of Client

Этот интерфейс:

public interface IClientAppService : IApplicationService 
{
    ListResultDto<ClientDto> GetClients(GetClientInput input);
    Task CreateClient(ClientDto input);
}

Этот AppService

public class ClientAppService : ApplicationService, IClientAppService
{
    private readonly IRepository<Client, long> _clientRepository;        

    public ClientAppService(IRepository<Client, long> clientRepository)
    {
        _clientRepository = clientRepository;
    }

    public async Task CreateClient(ClientDto input)
    {
        try
        {
            var client = input.MapTo<Client>();

            client.SetNormalizedNames();
            await _clientRepository.InsertAsync(client);
        }
        catch(Exception e)
        {
            var a = e;
        }

    }

    public ListResultDto<ClientDto> GetClients(GetClientInput input)
    {
        var clients = _clientRepository
            .GetAll()
            .WhereIf(
                !input.Filter.IsNullOrEmpty(),
                c => c.Name.Contains(input.Filter) ||
                c.Surname.Contains(input.Filter) ||
                c.EmailAddress.Contains(input.Filter)
            )
            .OrderBy(c => c.Surname)
            .ThenBy(c => c.Name)
            .ToList();

        return new ListResultDto<ClientDto>(clients.MapTo<List<ClientDto>>());
    }
}

Этот клиентDto

public class ClientDto : EntityDto<long>
{
    [Required]
    [StringLength(AbpUserBase.MaxUserNameLength)]
    public string UserName { get; set; }

    [Required]
    [StringLength(AbpUserBase.MaxNameLength)]
    public string Name { get; set; }

    [Required]
    [StringLength(AbpUserBase.MaxSurnameLength)]
    public string Surname { get; set; }

    [Required]
    [EmailAddress]
    [StringLength(AbpUserBase.MaxEmailAddressLength)]
    public string EmailAddress { get; set; }

    public bool IsActive { get; set; }

    public string[] RoleNames { get; set; }

    [Required]
    [StringLength(18, ErrorMessage = "La {0} debe ser de al menos {2} caracteres.", MinimumLength = 6)]
    [RegularExpression(@"^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)).+$")]
    [DataType(DataType.Password)]
    [Display(Name = "Contraseña")]
    public string Password { get; set; }

    [Required]
    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? BirthDate { get; set; }

    [Required]
    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? RegisterDate { get; set; }
}

Это конфигурация Automapper

cfg.CreateMap<ClientDto, Client>();
            cfg.CreateMap<ClientDto, Client>().ForMember(x => x.Roles, opt => opt.Ignore());
            cfg.CreateMap<Client, ClientDto>();

И добавить это в dbContext

public DbSet<Client> Clients { get; set; }

Прямо сейчас все это работает! Я могу использовать GetClients и CreateClient.

Полагаю, что это правильный путь. Если кто-то может проверить код и, возможно, дать мне несколько советов о том, как использовать некоторые функции класса User, было бы замечательно!

Сейчас я не могу использовать класс ClientManager, я не понимаю, какие параметры используют. Так что я просто использую хранилище.

...