【其实和Cqrs没啥关系】
缘由
其实没啥原因,只是觉得以前写了不知多少遍的用户登录复用性太差,实现的功能也不多。
依赖的Nuget包
简单登陆
就简单登陆而言,只需要实现如下接口/抽象类:
Store相关:
IUserLockoutStore<DpfbUser,Guid> , IUserPasswordStore<DpfbUser,Guid>, IUserTwoFactorStore<DpfbUser,Guid>, IUserEmailStore<DpfbUser,Guid>
Manager相关:
UserManager<DpfbUser, Guid>, SignInManager<DpfbUser, Guid>
打包的代码:
public class AppSignInManager : SignInManager<DpfbUser, Guid> { public AppSignInManager() : base(WebContextHelper.CurrentOwinContext.Get<AppUserManager>(), WebContextHelper.CurrentOwinContext.Authentication) { } public override async Task<ClaimsIdentity> CreateUserIdentityAsync(DpfbUser user) { var userIdentity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; } } public class AppUserManager : UserManager<DpfbUser, Guid> { public AppUserManager(DpfbUserStore store) : base(store) { } public AppUserManager() : this(WebContextHelper.CurrentOwinContext.Get<DpfbUserStore>()) { } } public class DpfbUserStore : //IUserStore<DpfbUser, Guid>, IUserLockoutStore<DpfbUser, Guid>, IUserPasswordStore<DpfbUser,Guid>, IUserTwoFactorStore<DpfbUser,Guid>, IUserEmailStore<DpfbUser,Guid> { [Dependency] internal IDpfbUserQueryEntry UserQueryEntry { get { return CqrsConfigurationResolver.Config.Construct<IDpfbUserQueryEntry>(); } } internal ICommandBus CommandBus { get { return CqrsConfigurationResolver.CommandBus; } } public Task CreateAsync(DpfbUser user) { throw new NotImplementedException(); } public Task DeleteAsync(DpfbUser user) { throw new NotImplementedException(); } public Task<DpfbUser> FindByIdAsync(Guid userId) { return UserQueryEntry.TryFetchAsync(userId); } public Task<DpfbUser> FindByNameAsync(string userName) { return UserQueryEntry.TryFetchByNameAsync(userName); } public Task UpdateAsync(DpfbUser user) { //throw new NotImplementedException(); return Task.FromResult(0); } public void Dispose() { //do nothing } public Task<DateTimeOffset> GetLockoutEndDateAsync(DpfbUser user) { //throw new NotImplementedException(); return Task.FromResult(new DateTimeOffset(DateTime.Now)); } public Task SetLockoutEndDateAsync(DpfbUser user, DateTimeOffset lockoutEnd) { //throw new NotImplementedException(); return Task.FromResult(0); } public Task<int> IncrementAccessFailedCountAsync(DpfbUser user) { throw new NotImplementedException(); return Task.FromResult(0); } public Task ResetAccessFailedCountAsync(DpfbUser user) { return Task.FromResult(0); } public Task<int> GetAccessFailedCountAsync(DpfbUser user) { return Task.FromResult(0); throw new NotImplementedException(); } public Task<bool> GetLockoutEnabledAsync(DpfbUser user) { return Task.FromResult(false); throw new NotImplementedException(); } public Task SetLockoutEnabledAsync(DpfbUser user, bool enabled) { return Task.FromResult(0); throw new NotImplementedException(); } public Task SetPasswordHashAsync(DpfbUser user, string passwordHash) { CommandBus.Send(new SetPasswordHashCommand() {UserId = user.Id, PasswordHash = passwordHash}); return Task.FromResult(0); } public Task<string> GetPasswordHashAsync(DpfbUser user) { return UserQueryEntry.FetchPasswordHashAsync(user.Id); } public Task<bool> HasPasswordAsync(DpfbUser user) { return UserQueryEntry.HasPasswordAsync(user.Id); } public Task SetTwoFactorEnabledAsync(DpfbUser user, bool enabled) { return Task.FromResult(false); throw new NotImplementedException(); } public Task<bool> GetTwoFactorEnabledAsync(DpfbUser user) { return Task.FromResult(false); throw new NotImplementedException(); } public Task SetEmailAsync(DpfbUser user, string email) { throw new NotImplementedException(); return Task.FromResult(0); } public Task<string> GetEmailAsync(DpfbUser user) { throw new NotImplementedException(); } public Task<bool> GetEmailConfirmedAsync(DpfbUser user) { throw new NotImplementedException(); return Task.FromResult(true); } public Task SetEmailConfirmedAsync(DpfbUser user, bool confirmed) { throw new NotImplementedException(); return Task.FromResult(0); } public Task<DpfbUser> FindByEmailAsync(string email) { throw new NotImplementedException(); } }