在ASP.Net MVC中保持干燥

时间:2009-06-09 02:33:10

标签: c# asp.net-mvc dry

我目前正在使用我的第一个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;
    }
}

现在,这是不是漂亮的代码。我想稍微解决一下,但截至目前,我正在四处修理它。事实上,它已成为一些错误的根源,这意味着它会再次在所有四个地方修复它。

您如何建议我将此系统保持DRY?请注意,由于多种原因,这两个对象必须保留在会话中。

3 个答案:

答案 0 :(得分:4)

在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();
    }
}

同样对于其他两种方法......

答案 1 :(得分:4)

您可以从BaseViewPage,BaseViewUserControl和BaseViewMasterPage中删除代码。渲染视图时使用的所有数据都可以作为viewdata从控制器传递给它们,而viewdata已在所有视图中可用。这会将您的代码至少集中到控制器基类。

答案 2 :(得分:4)

使用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
    }
}