web|问题
--------------------------------<特别声明,此文档是转载,黄勇BLOG的文章>-----------------------------------
搭建系统框架发现的三个Web.Config问题
按照微软的Duwamish7搭建一个Web系统框架,虽然说是一个现成的框架在旁边,却还是遇到一些烦人的小问题,其中有好几个就是这个Web.Config搞的鬼!
1。搭建好的系统框架运行出错,报什么不能正确读取ApplicationConfiguration配置节,但我的配置节部份完全是从Duwamish7中Copy过来,而且昨天还好好的啊?也不记得弄了多久,试了多少次自己也都觉得不可能的方法,都无功而返。最后,看着它发呆,一筹莫展时,一个念头闪过:ApplicationConfiguration?是不是太多了。改成AppCofiguration,再试,天啊!竟然成功了!晕!
<configSections>
<section name="AppConfiguration" type="AVWeb.SystemFramework.ApplicationConfiguration, AVWeb.SystemFramework" />
</< SPAN>configSections>
2。也是运行报Web.Config某注释行出错,注释如下:
-- Database type 0--Access 1--SqlServer -->
因为对这个不太熟悉,也是弄了很久才知道:<!-- -->中包含的注释不能包含有"--"字符
3.想在页面上调用Javascript写的一个日历控件,其中有中文注释,把js文件包括在页面中,但一运行,怎么也不能正常装载,老是报“未结束的字符串常量”等错误,弄了半天之后,才明白是字符集搞的鬼!
Web.Config文件中配置的字符集非常重要,也就是这个:<globalization responseEncoding="gb2312" requestEncoding="gb2312" />
如果程序中有中文,但Encoding又不是gb2312的话,可能很多莫名其妙的问题就来了!
Duwamish7学习笔记(二)
SystemFrameWork项目
SystemFrameWork项目是一个能直接移植到别的应该程序的项目,可以不修改或很少的修改代码而直接使用。
项目主要为3个类。
1.ApplicationConfiguration类
此类为应用级的配置类,实现IConfigurationSectionHandler接口。与前面讲的DuwamishConfiguration类实现方法类同。主要方法为Create(),OnApplicationStart(),ReadSetting()。
如果要使用此类,需于Global.asax的Application_OnStart事件中调用 ApplicationConfiguration.OnApplicationStart(Context);
public static void OnApplicationStart(String myAppPath)
{
appRoot = myAppPath;
System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration");
System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration");
System.Configuration.ConfigurationSettings.GetConfig("SourceViewer");
}
此方法通用调用ConfigurationSettingis.GetConfig()方法通过Web.Config中的取得对应的解析类,调用相应的Create()方法。如果没有对应的配置解析类则可直接调用System.Configuration.NameValueSectionHandler类解析,GetConfig("SourceViewer")即是如此。
2.ApplicationAssert类
此类主要用来帮忙开发人员进行错误检查,日志记录等。主要有Check(),CheckCondition(),GenerateStackTrace()三方法和LineNumber属性。
[ConditionalAttribute("DEBUG")]应用于Check(),和GenerateStackTrace()方法,如果Debug常量被定义,此方法可以被调用。
3.ApplicationLog类
此类主要用来进行日志记录。
定义Error(1)、Warning(2)、Info(3)、Verbose(4)四个TraceLevel级别记录日志调试和跟踪信息.具体设置于Web.Config的配置节中定义。此类中所有方法均为static方法,是主要的为static void WriteLog(level,messageText)
如果写入的TraceLevel不大于配置中定义的级别,则把对应的调试、跟踪信息按定义的级别写入Windows 事件日志中和定义的跟踪文件中.
ApplicationLog类的构造函数声明为private static,在对ApplicationLog类进行第一次调用时从配置文件中取得配置信息进行初始化。
疑问:
1.在 static ApplicationLog()中运用了System.Threading.Monitor,保证多线程操作的安全性。为什么对ApplicationLog要进行锁的控制?
2.对System.Diagnostics命名空间中某些类理解不太清楚。
MSDN帮助:
1.Monitor 类
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemthreadingmonitorclasstopic.htm
2.System.Diagnostics 命名空间(提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互)
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemdiagnostics.htm
posted on Friday, December 17, 2004 11:27 AM
Duwamish7学习笔记(三)
DataAccess项目
DataAccess项目中共4个类:Books类,Categories类,Customers类,Orders类.均实现了IDisposable接口。用来关闭活动的数据库连接。
这是MS提倡的一种释放非托管资源的Dispose模式。有关Dispose模式《.NET框架程序设计(修订本)》的19章“自动内存管理(垃圾收集)”有精采的论述.
类中通过调用存储过程,封装了对4个业务对象的Select,Insert,Update操作。
Select操作通过SqlDataAdapter的Fill方法填充对应的继承自DataSet的业务实体类,返回给调用者。Books类和Categories类只有Select操作.
Insert和Update操作通过一个private 函数返回InsertCommand或UpdateCommand对象。再于对外的的Public函数调用Private内部函数完成相应操作。Customers类中实现Insert,Update,Select操作,Orders类只有Insert操作。
在Customers类的LoadCustomerByEmail()方法中有对ApplicationAssert类的CheckCondition()方法调用
ApplicationAssert.CheckCondition(data.Tables[CustomerData.CUSTOMERS_TABLE].Rows.Count <= 1, "Integrity Failure: non-unique e-mail address", ApplicationAssert.LineNumber);
疑问:
1.数据访问层感觉实现了业务逻辑层的内容,平时如LoadCustomerByEmail()等方法都是写在业务逻辑层的。
2.是否有必要抽象出一个完全对数据库操作的基类,实现对数据库底层的操作?而不是在每个类如:Books,Customers中均一次次重写如SqlCommand对象,Dispose模式?
Duwamish7学习笔记(四)
BusinessRules项目
1.Customer类
长见识了!在《Duwamish7学习笔记(三)》中还在想业务逻辑层写些什么东西。
校验,还是校验!每一行,每一列,包括类型和长度,想想自已在项目的校验,真的有点汗颜!
//----------------------------------------------------------------
// Function Validate:
// Validates and customer
// Returns:
// true if validation is successful
// false if invalid fields exist
// Parameters:
// [in] customerRow: CustomerData to be validated
// [out] customerRow: Returns customer data. If there are fields
//