我目前正在使用我的第一个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?请注意,由于多种原因,这两个对象必须保留在会话中。
答案 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
}
}