现在的位置: 首页 > 综合 > 正文

Community server 杂笔

2013年04月12日 ⁄ 综合 ⁄ 共 6217字 ⁄ 字号 评论关闭
MapPath
{
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中,而是直接放到内存中,显式控制超时时间。

自定义的事件模块:

<add name = "CSExceptionModule" type = "CommunityServer.Components.CSExceptionModule, CommunityServer.Components" />
  
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文件来实现松散耦合,运用一些反射什么的就可以实现了。

 

抱歉!评论已关闭.