{
if(_httpContext != null)
return _httpContext.Server.MapPath(path);
else
_rootPath = AppDomain.CurrentDomain.BaseDirectory;
string dirSep = Path.DirectorySeparatorChar.ToString();
_rootPath = _rootPath.Replace("/", dirSep);
return rootPath + path.Replace("/", Path.DirectorySeparatorChar.ToString()).Replace("~", "");
}
数据序化:
直接把对象数据序列话成一个字符串,这样就避免的为将来的增加字段预留空间。Opxxx
(转:
开发过CRM的朋友应该都有体会,很多字段需要预留在数据库中,因为你不了解使用CRM系统的客户会有一些什么样的存储要求,如:CRM用户需要保存他客户的年龄,但是CRM系统设计过程中不可能为这样一个问题特意的加入这个存储字段,通常的做法是给一些空字段,用户使用的时候相应的对他进行初始化。但是导致的结果就是CRM的数据库惨不忍睹。更可怕的是,如果要进行软件升级的时候如果需要添加一些原本没有的字段,非常的麻烦,从实体类到数据库操作的存储过程都需要更改。而数据序化可以解决这个问题,其实当我第一次看到CS这种做法的时候是非常兴奋的:第一,实现了添加字段不需要重新写数据操作类,更不需要对相关的存储过程进行修改。第二,存储的字段很工整,全部值都保存在两个字段中.)
数据缓存
那些常用的数据,不是放到Cache中,而是直接放到内存中,显式控制超时时间。
自定义的事件模块:
public interface ICBModule
{
void Init(CBApplication csb, System.Xml.XmlNode node);
}
/// <summary>
/// Summary description for CBApplication
/// </summary>
public sealed class CBApplication
{
private readonly static CBApplication _instance = new CBApplication();
public static CBApplication Current
{
get
{
//XmlNode cbNode = WebConfigurationManager.GetSection("Cobrand") as XmlNode;
//XmlNodeList nodeList = cbNode.SelectNodes("CBModules/add");
//foreach (XmlNode node in nodeList)
//{
// string name = node.Attributes["name"].Value;
// string type = node.Attributes["type"].Value;
// ICBModule mod = Activator.CreateInstance(Type.GetType(type)) as ICBModule;
// if (mod != null)
// {
// mod.Init(_instance, node);
// _instance.modules.Add(name, mod);
// }
//}
return _instance;
}
}
private Hashtable modules = new Hashtable();
private EventHandlerList Events = new EventHandlerList();
private static object EventPostDocumentLoad;
private static object EventPrePageLoad;
private static object EventPreGenContent;
private CBApplication()
{
EventPostDocumentLoad = new object();
EventPrePageLoad = new object();
EventPreGenContent = new object();
XmlNode cbNode = WebConfigurationManager.GetSection("Cobrand") as XmlNode;
XmlNodeList nodeList = cbNode.SelectNodes("CBModules/add");
foreach (XmlNode node in nodeList)
{
string name = node.Attributes["name"].Value;
string type = node.Attributes["type"].Value;
ICBModule mod = Activator.CreateInstance(Type.GetType(type)) as ICBModule;
if (mod != null)
{
mod.Init(this, node);
this.modules.Add(name, mod);
}
}
}
public event CBContextHandler PrePageLoad
{
add { Events.AddHandler(EventPrePageLoad, value); }
remove { Events.RemoveHandler(EventPrePageLoad, value); }
}
public void ExecutePrePageLoad(HttpContext context)
{
ExecuteContextEvent(EventPrePageLoad, context);
}
private void ExecuteContextEvent(object EventKey, HttpContext context)
{
CBContextHandler handler = Events[EventKey] as CBContextHandler;
if (handler != null)
{
handler(context);
}
}
public event CBDocumentHandler PreGenContent
{
add { Events.AddHandler(EventPreGenContent, value); }
remove { Events.RemoveHandler(EventPreGenContent, value); }
}
public void ExecutePreGenContent(HttpContext context, XmlDocument doc, PageItem pageItem)
{
ExecuteDocumentEvent(EventPreGenContent, context, doc, pageItem);
}
public event CBDocumentHandler PostDocumentLoad
{
add { Events.AddHandler(EventPostDocumentLoad, value); }
remove { Events.RemoveHandler(EventPostDocumentLoad, value); }
}
public void ExecutePostDocumentLoad(HttpContext context, XmlDocument doc, PageItem pageItem)
{
ExecuteDocumentEvent(EventPostDocumentLoad, context, doc, pageItem);
}
private void ExecuteDocumentEvent(object EventKey,HttpContext context, XmlDocument doc, PageItem pageItem)
{
CBDocumentHandler handler = Events[EventKey] as CBDocumentHandler;
if (handler != null)
{
handler(context, doc, pageItem);
}
}
}
S中的Job:“干一些零碎事情的钟点工”。
Tasks 中的Modules插件可以针对所有task执行过程中某些阶段进行插入管理
Threads定义一些定时任务
Module捕捉异常处理如异常处理
public class CSTaskModule : ITaskModule
{
public void Init(TaskApplication taskApplication, XmlNode node)
{
taskApplication.TaskException += new TaskExceptionEventHandler(taskApplication_TaskException);
}
<Tasks>
<Modules>
<add name="CSTaskModule" type="CommunityServer.Components.CSTaskModule, CommunityServer.Components" />
</Modules>
<Threads>
<Thread minutes="15">
<task name = "SiteStatisticsUpdates" type = "CommunityServer.Components.SiteStatisticsJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" />
.....
对某个集合集进行遍历处理
SiteSettingsManager.IterateSiteSettings(new SiteSettingsListIterator(SendQueuedEmailJob));
转:
什么时候你要使用IHttpHandlerFactory而不去使用IHttpHandler,我就个人的开发经验做一下总结:
1:在一个项目中需要使用很多IHttpHandler的时候,而且对这些IHttpHandler判断都重复做一个同样的前期处理,如果防盗链的例子中对图片和压缩两个不同HttpHandler的处理,但是他们对URL的判断都是一致的,在.Text中使用了IHttpHandlerFactory,而不是IHttpHandler,对于URL的请求全都(*.asmx、Error.aspx除外)转交由一个IHttpHandlerFactory入口统一处理。
2:从部署和松散耦合考虑,如果你的web application足够大(我目前还没有设计过这种大型app),你就要考虑在更换HttpHandler处理类的时候该不该去改动Web.config的配置,这种改动将会重新启动整个app,对于一些系统而言这是不可以随便进行的。这个时候,统一一个入口的IHttpHandlerFactory很重要,这个入口相对不变,而IHttpHandler实现可以通过外挂自定义的xml文件来实现松散耦合,运用一些反射什么的就可以实现了。