Держать его сухим в ASP.Net MVC - PullRequest
5 голосов
/ 09 июня 2009

В настоящее время у меня есть две с половиной недели для моего первого приложения ASP.Net MVC, и до сих пор я люблю его.

Этот текущий проект является портом проекта ASP.Net WebForms, и я пытаюсь сохранить его работоспособность. Все идет хорошо.

Однако я повторяю ... себя.

Например, в моем классе BaseController, в моем BaseViewPage, в моем BaseViewUserControl и в моем BaseViewMasterPage у меня есть следующий код:

protected LanLordzApplicationManager AppManager
{
    get
    {
        if(Session["Application"] == null)
        {
            Session["Application"] = new LanLordzApplicationManager(Server.MapPath("~/"));
        }

        return (LanLordzApplicationManager)Session["Application"];
    }
}

protected User CurrentUser
{
    get
    {
        if (Session["UserID"] == null && this.Request.Cookies["AutoLogOnKey"] != null && !string.IsNullOrEmpty(this.Request.Cookies["AutoLogOnKey"].Value))
        {
            this.CurrentUser = this.AppManager.RecallUser(this.Request.Cookies["AutoLogOnKey"].Value, Request.UserHostAddress);
        }

        if (Session["UserID"] == null)
        {
            return null;
        }
        else
        {
            return this.AppManager.GetUserByUserID((long)Session["UserID"]);
        }
    }
    set
    {
        Session["UserID"] = value.UserID;
    }
}

Теперь, это не красивый код. Я хотел бы исправить это немного, но на данный момент я исправляю это в четырех местах. Фактически, это было источником нескольких ошибок, которые означали, что они снова будут исправлены во всех четырех местах.

Как бы вы посоветовали оставить эту систему СУХОЙ? Обратите внимание, что оба этих объекта должны храниться в сеансе по нескольким причинам.

Ответы [ 3 ]

4 голосов
/ 09 июня 2009

Вы можете удалить код из BaseViewPage, BaseViewUserControl и BaseViewMasterPage. Все данные, используемые при визуализации представлений, могут быть переданы им из контроллера в виде представлений, которые уже доступны во всех представлениях. Это централизует ваш код, по крайней мере, для базового класса контроллера.

4 голосов
/ 09 июня 2009

Используйте Mixins!

interface IWebRequestable { 
     HttpWebRequest Request {get;}   // Right class? Not sure.
}

public class BaseUserControl : UserControl, IWebRequestable {}
public class BaseController : Controller, IWebRequestable {}
public class BasePage : Page, IWebRequestable {}

public static class CurrentUserMixin {
    public static User GetCurrentUser(this IWebRequestable RequestObject) {
         // Put your User code here
    }
}
4 голосов
/ 09 июня 2009

В App_Code создайте класс «BaseUtils» или другой, содержащий эту функциональность; тогда вы просто должны включить ссылку, где это необходимо ...

public class BaseUtils 
{
     public static LanLordzApplicationManager getAppMgr()
     {
         HttpSession Session = HttpContext.Current.Session;
         if(Session["Application"] == null)
         {
            Session["Application"] = new LanLordzApplicationManager(Server.MapPath("~/"));
         }

         return (LanLordzApplicationManager)Session["Application"];

     }


}

и на вашей странице

protected LanLordzApplicationManager AppManager
{
    get
    {
        return BaseUtils.getAppMgr();
    }
}

И аналогично для двух других методов ...

...