مسلما بهترینش Identity 2.0 است و با اختلاف زیاد نسبت به روشهای قبل بهینه سازی شده . اضافه کردن فیلد جدید به این جدول خیلی هم ساده است . در فایل IdentityModel که همراه Individual User ساخته میشود کدهای زیر را قرار دهید :
public class MyUser : IdentityUser
{
public string Country { get; set; }
}
public class ApplicationUser : MyUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationU ser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
public string CityName { get; set; }
}
اگر به تعریف کلاس ApplicationDbContext نگاه کنید :
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
می بینید که این کلاس به کلاس ApplicationUser به صورت Generic وابسته است . حالا شما به هر روشی که فیلدر به کلاس ApplicationUser اضافه کنید خود به خود در جدول مربوط به کاربران اضافه میشود . در کد اول من فیلد CityName را مستقیما به این کلاس اضافه کردم و فیلد Country رو به کلاس MyUser اضافه کردم که بعدا کلاس ApplicationUser از آن ارث بری میکند. بعد از بازسازی جداول خواهید دید که هر دو فیلد به بانک اطلاعاتی اضافه میشوند.
پیاده سازی IUserManager زمانی لازم میشه که شما بخواهید مسئله ی لایه ها و جداسازی وابستگی را به صورت کاملا اصولی پیاده کنید. مخصوصا وقتی که لایه های شما در چند ClassLibrary جدا قرار داشته باشند. هر پروژه ای که بخواد از کاربرها استفاده کنه هم باید به Identity و هم باید به EntityFrameWork رفرنس داشته باشه که برای بعضی ها چندان مطلوب نیست. این یک اشکال خیلی ریز هسا و خیلی ها از کنارش میگذرند و تاثیری هم در نهایت پروژه ندارد. فقط اگر وسواس ساختاری دارید برای شما مهم میشود. و آن دوستانی که از این سطح به پروژه نگاه میکنند دردسر پیاده سازی IUserManager و سایر اینترفیس های مربوطه را هم به جان میخرند.
بعد برای ارتباط برقرار کردن بین سایر جداول و جدول کاربران مانند همیشه عمل میکنید.
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
همانطور که می بینید نقاط زیادی هست که شما می توانید روش های پیشفرض کاری Identity 2.0 را تغییر دهید. شما می توانید از همه کلاسهای مربوطه ارث بری کنید و یک متد خاص را Override کنید. در این روش شما مستقیما به DbContext دسترسی ندارید. فقط زمانی که اینترفیس ها را خودتان پیاده سازی کنید وابستگی سیستم مدیریت کاربران به EntityFramework را قطع کنید.