我正在使用ASP.NET Boilerplate,并且正在尝试获得最佳方法:
创建其他类型的用户(学生,教师,管理员),我读了此线程:https://forum.aspnetboilerplate.com/viewtopic.php?f=5&t=3213 但是我对所有过程都有些困惑。
我已经创建了扩展User实体的实体,但是我不确定如何在Application Service上使用它或如何创建实体管理器类。
我的首要目标是从管理页面添加/注册不同类型的用户,并可能允许这种不同类型的用户自己注册。
预先感谢...
更新:我一直在进行测试,首先创建另一个实体,这很简单,扩展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>>());
}
}
此ClientDto
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类,我不知道使用什么参数。所以我只是在使用存储库。