Chcąc użyć ASP.NET Identity musimy mieć klasy dziedziczące IUser oraz IRole które są właśnie dostarczone przez niego samego, ale jeżeli pozbawimy bibliotekę zawierającą domenę odniesienia do ASP.NET Identity to w projekcie MVC będzie trzeba odziedziczyć po klasie User z domeny oraz IUser z ASP.NET Identity.
public class AppUser : User, IUser
{
string IUser<string>.Id
{
get { return UserId.ToString(); }
}
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
}
I teraz aby tą nowo utworzoną klasę móc odwzorować w bazie danych musimy mieć generyczny kontekst Entity Framework, bo samo rzutowanie nie wystarczy z klasy AppUser na User(dostaniemy wyjątek o brakujących meta danych).
Następnie jeżeli będziemy tworzyć serwisy oparte o ten generyczny kontekst to one także będą musiały być generyczne, w najlepszym przypadku dwuparametrowe a może i więcej.
public interface IUserService<TUser, TRole> : IDisposable
{
#region TUser
Task CreateAsync(TUser TUser);
Task DeleteAsync(TUser TUser);
Task<TUser> FindByIdAsync(Guid TUserId);
Task<TUser> FindUserByNameAsync(string TUserName);
Task UpdateAsync(TUser TUser);
#endregion
}
public class UserService<TUser, TRole> : IUserService<TUser, TRole>
where TUser : User
where TRole : Role
{
private BizBoxDbContext<TUser, TRole> db;
public UserService()
{
db = new BizBoxDbContext<TUser, TRole>();
}
public static IUserService<TUser, TRole> Create()
{
return new UserService<TUser, TRole>();
}
public void Dispose()
{
db.Dispose();
}
#region User
public async Task CreateAsync(TUser user)
{
user.UserId = Guid.NewGuid();
db.Users.Add(user);
await db.SaveChangesAsync();
}
public async Task DeleteAsync(TUser user)
{
db.Users.Remove(user);
await db.SaveChangesAsync();
}
public async Task<TUser> FindByIdAsync(Guid userId)
{
return await db.Users.FindAsync(userId);
}
public async Task<TUser> FindUserByNameAsync(string userName)
{
return await db.Users.SingleOrDefaultAsync(u => u.UserName == userName);
}
public async Task UpdateAsync(TUser user)
{
db.Entry(user).State = EntityState.Modified;
await db.SaveChangesAsync();
}
#endregion
}