Я использую 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, и при миграции нам нужно добавить значение по умолчанию для этого столбца, проверьте следующее изображение:
Этот интерфейс:
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, я не понимаю, какие параметры используют. Так что я просто использую хранилище.