早上的帖子:http://topic.csdn.net/u/20120104/10/a1b106af-1d39-4fdd-89df-735ddca0de90.html
http://topic.csdn.net/u/20111214/18/9c3ec9fc-6da1-4873-8e3e-5f07cfb2d980.html修改后的代码,继续请教大牛,是否还需要完善?//根据不同等级,读取不同等级会员的模版,
public class TemplateRule
{
public TemplateRule(int LevelID, string Page)
{
this.Page = Page;
this.LevelID = LevelID;
this.Path = string.Format("/Template/{0}/{1}.html", this.levelID, this.Page);
}
/// <summary>
/// 是否需要缓存
/// </summary>
private bool IsCache { get; set; }
/// <summary>
/// 缓存键值
/// </summary>
private string CacheKey { get; set; }
/// <summary>
/// 路径
/// </summary>
private string Path { get; set; }
/// <summary>
/// 页面
/// </summary>
private string Page { get; set; }
/// <summary>
/// 会员等级
/// </summary>
private int levelID;
private int LevelID
{
get { return levelID; }
set
{
levelID = value;
string Rule = ConfigurationManager.AppSettings[levelID.ToString()];
IsCache = Rule.Length > 0 ? Convert.ToBoolean(Rule) : false;
if (IsCache)
CacheKey = ConfigurationManager.AppSettings[levelID + "CacheKey"] + this.Page;
}
}
/// <summary>
/// 获取模版
/// </summary>
/// <returns></returns>
public string GetTemplate()
{
string template = string.Empty;
if (!File.Exists(HttpContext.Current.Server.MapPath(this.Path)))
return template;
if (IsCache)
{
if (HttpContext.Current.Cache[CacheKey] == null)
HttpContext.Current.Cache.Insert(CacheKey, ReadTemplate(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
template = HttpContext.Current.Cache[CacheKey].ToString();
}
else
template = ReadTemplate();
return template;
}
/// <summary>
/// 读取模版
/// </summary>
/// <returns></returns>
protected string ReadTemplate()
{
string result = string.Empty;
StreamReader sr = null;
try
{
sr = new StreamReader(HttpContext.Current.Server.MapPath(this.Path), Encoding.GetEncoding("gb2312"));
result = sr.ReadToEnd();
}
catch
{
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
}
return result;
}
}配置文件配置是否需要开启缓存,以及设置缓存键值 <add key="10003" value="true" />
<add key="10002" value="false" />
<add key="10001" value="false" />
<add key="10000" value="false" />
<add key="10003CacheKey" value="Diamond"/>
//页面工厂,针对不同页面进行处理
public class PageFactory
{
private string page;
private string template;
private Model.CompanyTbl model;
public PageFactory(string page, string template,Model.CompanyTbl model)
{
this.page = page;
this.template = template;
this.model = model;
}
public string GetPage()
{
if (template.Length == 0)
return template;
switch (this.page)
{
case "Index":
return new PageHandler(template, model).GetIndex();
case "News":
return new PageHandler(template, model).GetNews();
//....
default:
return template;
}
}
}
//页面调用
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.QueryString["ID"]) && Common.RegexCommon.IsNumber(Request.QueryString["ID"]))
{
int CID = Convert.ToInt32(Request.QueryString["ID"]);
string Page = string.IsNullOrEmpty(Request.QueryString["PageName"]) ? "Index" : Request.QueryString["PageName"];
Model.CompanyTbl model = new GetCompanyModel(CID);
if (model != null)
{
TemplateRule tr;
string template = string.Empty;
if (model.CompPassed > 0)
tr = new TemplateRule(model.LevelID, Page);
else
tr = new TemplateRule(10000, Page);
template = tr.GetTemplate();
PageFactory pf = new PageFactory(Page, template, model);
Response.Write(pf.GetPage());
}
}
}
http://topic.csdn.net/u/20111214/18/9c3ec9fc-6da1-4873-8e3e-5f07cfb2d980.html修改后的代码,继续请教大牛,是否还需要完善?//根据不同等级,读取不同等级会员的模版,
public class TemplateRule
{
public TemplateRule(int LevelID, string Page)
{
this.Page = Page;
this.LevelID = LevelID;
this.Path = string.Format("/Template/{0}/{1}.html", this.levelID, this.Page);
}
/// <summary>
/// 是否需要缓存
/// </summary>
private bool IsCache { get; set; }
/// <summary>
/// 缓存键值
/// </summary>
private string CacheKey { get; set; }
/// <summary>
/// 路径
/// </summary>
private string Path { get; set; }
/// <summary>
/// 页面
/// </summary>
private string Page { get; set; }
/// <summary>
/// 会员等级
/// </summary>
private int levelID;
private int LevelID
{
get { return levelID; }
set
{
levelID = value;
string Rule = ConfigurationManager.AppSettings[levelID.ToString()];
IsCache = Rule.Length > 0 ? Convert.ToBoolean(Rule) : false;
if (IsCache)
CacheKey = ConfigurationManager.AppSettings[levelID + "CacheKey"] + this.Page;
}
}
/// <summary>
/// 获取模版
/// </summary>
/// <returns></returns>
public string GetTemplate()
{
string template = string.Empty;
if (!File.Exists(HttpContext.Current.Server.MapPath(this.Path)))
return template;
if (IsCache)
{
if (HttpContext.Current.Cache[CacheKey] == null)
HttpContext.Current.Cache.Insert(CacheKey, ReadTemplate(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
template = HttpContext.Current.Cache[CacheKey].ToString();
}
else
template = ReadTemplate();
return template;
}
/// <summary>
/// 读取模版
/// </summary>
/// <returns></returns>
protected string ReadTemplate()
{
string result = string.Empty;
StreamReader sr = null;
try
{
sr = new StreamReader(HttpContext.Current.Server.MapPath(this.Path), Encoding.GetEncoding("gb2312"));
result = sr.ReadToEnd();
}
catch
{
}
finally
{
if (sr != null)
{
sr.Close();
sr.Dispose();
}
}
return result;
}
}配置文件配置是否需要开启缓存,以及设置缓存键值 <add key="10003" value="true" />
<add key="10002" value="false" />
<add key="10001" value="false" />
<add key="10000" value="false" />
<add key="10003CacheKey" value="Diamond"/>
//页面工厂,针对不同页面进行处理
public class PageFactory
{
private string page;
private string template;
private Model.CompanyTbl model;
public PageFactory(string page, string template,Model.CompanyTbl model)
{
this.page = page;
this.template = template;
this.model = model;
}
public string GetPage()
{
if (template.Length == 0)
return template;
switch (this.page)
{
case "Index":
return new PageHandler(template, model).GetIndex();
case "News":
return new PageHandler(template, model).GetNews();
//....
default:
return template;
}
}
}
//页面调用
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.QueryString["ID"]) && Common.RegexCommon.IsNumber(Request.QueryString["ID"]))
{
int CID = Convert.ToInt32(Request.QueryString["ID"]);
string Page = string.IsNullOrEmpty(Request.QueryString["PageName"]) ? "Index" : Request.QueryString["PageName"];
Model.CompanyTbl model = new GetCompanyModel(CID);
if (model != null)
{
TemplateRule tr;
string template = string.Empty;
if (model.CompPassed > 0)
tr = new TemplateRule(model.LevelID, Page);
else
tr = new TemplateRule(10000, Page);
template = tr.GetTemplate();
PageFactory pf = new PageFactory(Page, template, model);
Response.Write(pf.GetPage());
}
}
}
解决方案 »
- 求助。VS2010 C#程序打包安装在其他电脑连接数据库失败
- “Aceess数据库”和“Ria WCF Service”
- 调查:c#开发者使用的Visual Studio版本
- C#调用C写的DLL要如何转换参数的数据类型
- 51Crack 进来接分
- ftp C#如何实现同时下载多个服务器的文件
- 操作MySql数据库时无法使用中文的问题
- C#帮我改一改代码?谢谢!!
- 请问我在.aspx页面中定义的控件,比如<asp:label>等,在.aspx.cs页面中去不能引用,运行老是报错,请高手指点是怎么回事,小弟很着急!
- textbox焦点转移!!不是幼稚的问题,还望指教。
- 怎么通过代码来打开一个项目文件?
- datePicker1和 timePicker1 的使用请教
想去留言下都不行了。
-----------------
switch (this.page)
{
case "Index":
return new PageHandler(template, model).GetIndex();
case "News":
return new PageHandler(template, model).GetNews();
//....
default:
return template;
}
--------------------
问题依然存在啊
switch (levelID)
{
case 1:
baseClass = new Diamond(levelID);
break;
case 2:
baseClass = new Gold(levelID);
break;
case 3:
baseClass = new Silver(levelID);
break;
case 4:
baseClass = new General(levelID);
break;
default:
baseClass = new General(10000);
break;
}
上面那个switch(this.page)这个不知道该怎么改。
因为要根据页面参数,然后根据这个参数去读取这个页面的模版进行替换。
麻烦非哥指点下/
switch (this.page)
{
case "Index":
return new PageHandler(template, model).GetIndex();
case "News":
return new PageHandler(template, model).GetNews();
//....
default:
return template;
}如果你的环境支持的话,可以用表达式树来完成此工作思想是一样,根据不同的参数返回类型一样的东东 可能是类也可能是方法句柄
如果是单参数的话,像index news这类的,用一个Directory<string,delegate>可以实现类似的功能,就是有点慢。但是放在TemplateRule里确实不应该。
可能你需要一个类似 TemplateRuleBuilder or TemplateRuleFactory 的东东
是建一个这种类,然后把本来的属性,page,path等提取出来放到里面,然后只保留一个TemplateRuleBuilder这个类
是这个意思吗?
比如www.xxxx.com/CompanyID/Index.html------这个对应的是首页
比如www.xxxx.com/CompanyID/News.html------这个对应的是新闻页
而我根据Index,News这个参数,来加载相对应的首页,新闻页模版。
刚开始有想到用表驱动法和反射,可是表驱动法,一开始要全部加载进来,怕影响效率。
而如果用反射去实例化相应摸块,也是怕对效率有影响。
我只是个初学者,只是想设计的面向对象点,封装好点,方便以后扩展。以上您,非哥,螃蟹哥提到的很多都没接触过,非常感谢你们的指点。
至于您说的那个用委托,我写了个,可是还是要switch一个个枚举出来额,可能我不了解您的想法,麻烦在指点下。工厂方法我也想了下,好象也是要switch出来! public delegate string PageDelegate(string Template, int CID);
public string GetPage()
{
PageDelegate pd = null;
if (template.Length == 0)
return template;
switch (this.page)
{
case "Index":
pd = new PageDelegate(GetIndex);
break;
case "News":
pd = new PageDelegate(GetNews);
break;
default:
break;
}
if (pd == null)
return string.Empty;
return pd(template, 7);
}
public class TemplateRuleBuilder
{
public TemplateRuleBuilder(int LevelID, string Page)
{
this.page = Page;
this.path = string.Format("/Template/{0}/{1}.html", LevelID, Page);
isCache = GetSetting(LevelID.ToString()) == "true" ? true : false;
cacheKey = isCache ? GetSetting(LevelID + "CacheKey") + Page : "";
}
public string GetSetting(string key)
{
return ConfigurationManager.AppSettings[key];
}
private bool isCache;
/// <summary>
/// 是否需要缓存
/// </summary>
public bool IsCache
{
get { return isCache; }
set { isCache = value; }
}
private string cacheKey;
/// <summary>
/// 缓存键值
/// </summary>
public string CacheKey
{
get { return cacheKey; }
set { cacheKey = value; }
}
private string path;
/// <summary>
/// 模版路径
/// </summary>
public string Path
{
get { return path; }
set { path = value; }
}
private string page;
/// <summary>
/// 模版文件名
/// </summary>
public string Page
{
get { return page; }
set { page = value; }
}
而TemplateRule的只用TemplateRuleBuilder这个属性 public TemplateRule(int LevelID, string Page)
{
trb = new TemplateRuleBuilder(LevelID, Page);
}
/// <summary>
/// 模板相关属性
/// </summary>
private TemplateRuleBuilder trb;
TemplateRuleBuilder or TemplateRuleFactory
TemplateRule 不需要关心 内部属性的取值
只关心它要做的事就可以了
译文:所以在用兵上,只听说有指挥拙笨但却要求战争速决的,从未见有指挥灵巧而要求战争旷日持久的
另1个核心是view 和control分离,而这个访问匹配规则很明显是用的反射
那么就微软这个mvc的表现效率到底有多“差”,也没多差把,博客园那拨还在大力鼓吹mvc就是好,效率就是高
//{
// if (template.Length == 0)
// return template;
// switch (this.page)
// {
// case "Index":
// return new PageHandler(template, model).GetIndex();
// case "Contact":
// return new PageHandler(template, model).GetContact();
// case "Aboutus":
// return new PageHandler(template, model).GetAboutus();
// case "News":
// return new PageHandler(template, model).GetNews();
// case "Business":
// return new PageHandler(template, model).GetBusiness();
// case "Product":
// return new PageHandler(template, model).GetProduct();
// case "Join":
// return new PageHandler(template, model).GetJoin();
// case "Video":
// return new PageHandler(template, model).GetVideo();
// case "VDetail":
// return new PageHandler(template, model).GetVDetail();
// case "Certificate":
// return new PageHandler(template, model).GetCertificate();
// case "ShopFace":
// return new PageHandler(template, model).GetShopFace();
// default:
// return template;
// }
//}
public string GetPage()
{
if (template.Length == 0)
return template;
Type type = typeof(PageHandler);
object o = Activator.CreateInstance(type, new object[] { template, model });
System.Reflection.MethodInfo mi = type.GetMethod("Get" + page);
if (mi == null)
return string.Empty;
return mi.Invoke(o, null).ToString();
}这样确实比较方便,而且也容易扩展,我在本机测试,运算多次取平均值,差别不大。
不知道放到服务器上后,一些带宽,服务器配置会不会影响这个差别,影响大吗!因为服务器上不止一个网站。您是建议用反射还是用上面那个注释掉的方法,还是有什么更好的方法呢?