У меня есть атрибут контроллера, который называется [requireCompletedProfile], и я могу использовать методы действий, чтобы запретить пользователям идти туда, если они не завершили свой профиль.
Это работало нормально, когда у меня был один тип пользователей, но с тех пор приложение превратилось в 2 типа пользователей: продавцы и клиенты.
Итак, больше нет таблицы "User_Profile". Теперь есть «Client_Profile» и «Vendor_Profile», и их схемы отличаются. Я должен отметить, что я использую LINQ, но я сопоставляю все объекты LINQ с POCO, прежде чем возвращать их.
Моим решением было создать интерфейс с именем «User_Type», который имел следующий метод:
bool IsProfileCompleted();
Теперь мои объекты Client и мои объекты Vendor могут реализовывать интерфейс и отвечать за определение того, составляют ли их поля / члены их профиль.
Однако теперь, когда у меня несколько типов пользователей, я не могу точно определить, из какой таблицы извлекать профиль, поэтому мне нужно сделать что-то вроде этого:
public class RequiresCompleteProfileAttribute : ActionFilterAttribute
{
IUserRepository userRepo = new SqlUserRepository();
IClientProfileRepository clientProfileRepo = new SqlClientProfileRepo();
IVendorProfileRepository vendorProfileRepo = new SqlVendorProfileRepo();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// Database call #1
var user = userRepo.GetUserByUsername(User.Identity.Name);
UserType profile;
if (user.UserTypeName == "Client")
{
// Database call #2
profile = clientProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name);
}
else
{
// Database call #2
profile = vendorProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name);
}
if (!profile.IsProfileCompleted())
filterContext.HttpContext.Response.Redirect("/admin/editprofile/");
}
base.OnActionExecuting(filterContext);
}
}
Здесь вы можете видеть, что мне нужно сделать 2 вызова базы данных, один для определения типа пользователя, а другой для получения профиля из соответствующей таблицы.
Это плохая практика? Если так, что я должен сделать вместо этого?