Это плохая практика, чтобы сделать несколько отдельных вызовов базы данных из веб-приложения ASP.NET MVC? - PullRequest
3 голосов
/ 03 августа 2009

У меня есть атрибут контроллера, который называется [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 вызова базы данных, один для определения типа пользователя, а другой для получения профиля из соответствующей таблицы.

Это плохая практика? Если так, что я должен сделать вместо этого?

1 Ответ

4 голосов
/ 03 августа 2009

Это не совсем плохая практика, но вы бы хорошо обслужили наличие бизнес-объекта среднего уровня, который инкапсулирует логику запроса клиента по имени пользователя на основании имени пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...