1.确定项目需求
a.使用用例图:
2.分析:
a.ER图(找实体层)-->powerdesign工具 //powerdesign效率高
b. conceptial data model(ER图)
c. 不能有冗余的表(列的不可再分性)
d. 文件+文件夹
e. 实体可以按物理实体,抽象实体,业务功能的原子性来进行划分和创建
f. 三大范式:第一范式(确保每列保持原子性) ;第二范式(确保表中的每列都和主键相关) ;第三范式(确保每列都和主键列直接相关,而不是间接相关)
j. 也可以总结为:信息不可分;以分组消除冗余数据,组内有主键作为唯一标识;组内部的非主键数据不能相互依赖。
3.物理建模--->根据ER图来建模
a.Power Designer中创建physical Data Model
b. 创建主外键关系--->就是考虑谁来自于谁,谁先创建(引用就是对应起来)
c. 主键一定要有内容,但是外键可以没有内容
d.类型,单个元素的基本信息,枚举,共同可以被抽象的父类--->都可以作为一张主键表用来被引用
e. A,B两个表存在多对多的情况时,可以创建一个中间表C来实现该功能,例如下图:
4.表与表之间尽量创建关系--->以减少字段冗余和关系冗余
5.三层架构经典创建顺序
a.Entity(model)层 创建
b. IDAL(DAL接口)创建
c. DALsqlprovider(DBHelper)创建
d. DALFactory创建
e. BLL创建
f. UI创建
6.
a.反射可以不通过运行编译--->直接通过代码生成一个类的实例
b.反射-->在程序运行期间从Dll中获取属性或者创建类
c. 如在UI层不能直接使用DAL层的数据,所以可以将DAL编译生成DLL文件,UI层通过反射就可以直接使用
d.而且反射完成了接口和功能实现分离的原则,使BLL层通过DALfactory接口可以动态调用不同的数据库(例如:Oracle,Sql)
7.反编译研究代码工具: .net反编译 Reflect
8.抽象工厂模式
9. CodeSmith
a. 选择NetTier.cst---->然后根据属性开始生成代码 //NetTier.cst是N层架构的模板
b. 设计表最好用英文,codesmith对中unicode支持不好,中文会变成safename
b. codesmith的模板与aspx很像,每个模板的前台都可以视作aspx(其语法方式与aspx也相似,也支持C#指令)
而且每个模板后台都有一个cs(与aspx 的cs很相似)
c. codesmith的property(属性)可以以下几种方式进行声明:
* <%...%> //<%...%>中只能放方法和可以执行的语句或者属性(=...),不能放定义(例如:类和方法定义)
* codesmith前台编辑中: <script> public class... </script> //此种形式可以进行类和方法的定义,其中可以直接使用C#语法,然后该定义直接放入后台的Template中
d. <% table.name %> ---->可以像Item一样绑定一个数据列
e. entlib(框架)+codesmith -->生成数据访问层
f. codesmith中
*方法定义 <script runat="Template"> //相当于添加到后台C#库中,或者父类模板中;写在前台的script 只有当前模板使用
public string All()
{ string args=" ";
foreach(columnSchema col in this.currentTable) //当前表定义的属性
{
}
} </script>
* 方法调用 <% All() %>
10.
a. 一个表的外键对应的主键-->可能有多个列,所以该外键也有多个列
b.一个表可能有多个“主键”(被其他外键表所引用)
11. codesmith 中调试 Debug.writeline(pk.GetType().ToString) //
12.
a. 凡是多个产品系列(例如 : oracle,Access,sql)要进行切换就一定需要使用接口来将这个切换功能做出来
b.一般切换(接口)可以放置在总输入/输出端
13.使用codesmith每个模块生成代码的步骤
c. 在Main.cst中注册该模板
d. 调用Main.cst中的生成方法,eg:
private void GenerateIDALInterface( )
{
}
14.
a.DALsqlFactory--->是具体工程实例(其实就是数据库体系,oracle,sql) ,其内部拥有所有产品的privider
b. 而 DALsql--->是对IDAL的实现,是每个产品的类实现
15. Enterprise Liberay
c. common.dll ,data.dll ...--->此二库在Enterprise Liberay中很重要
d.有的插件或dll需要在config中配置
e.因为有DALFactory(sql,oracle,可以根据config进行不同的切换)--->引用其的类就是不能直接引用,而是使用反射来使用其动态生成的DLL,这样使用起来很方便,
不用将整个项目都编译
f. DBreader(在线模式)//效率高,但每次读取数据都要链接
DBdataset (离线模式) //效率低(相当于缓存)
g. datasource只要有虚拟表就可以
h. Enterprise Liberty -->相当于 DBHelp + DBserver
*主要用模板批量生成每个产品的insert、select、update、delete的所有存储过程
*然后再DALsql中使用其的类库方法+相应的存储过程进行操作
i. codesmith 标准循环方式:
<% foreach( columnschema col in this.currentTable.columns)
{%>
cmd.parameter.AddwithValue("@<%...%>,<%...%>"); //循环原样输出的就不用放在<% ...%>中
<% } %>
16.
j. 使用 Jquery可以屏蔽各个浏览器之间的差异
k. 样式布局可以将div+css和table方式结合起来使用
l. body样式是基本样式,其他页面内样式都继承该样式--->相当于全局默认样式
m.
iframe(左布局) | iframe(右布局) |
以上是master中的center
frameset只能使用行列的方式,但是iframe可以任意嵌入到一个布局中去
o. 所有表格默认情况都是左对齐
p. 表格中要使有继承关系: 表--->行--->列--->单元格
q. sitmap 控件-->可以实现网站地图
r. webconfig可以对这个网站,甚至单独的文件夹-->进行配置(eg:用户权限的配置)
17. 数据库中的null空值是一种类型,不是值,不能用==来进行判断,而是使用IsType来进行判断//相当于C#中的DBnull类型(不是值)
18. 使用反射的话,应先将库调试通过,否则使用反射调用DLL时,就无法进行调试(相当于黑箱)
19. reapter 很干净,不会像其他的ADO控件一样生成冗余的代码
20. 自定义绑定控件时,如果控件中嵌套一个控件,例如:一个reapter中嵌套一个reapter那么最好应该将该子控件放在ascx中,
因为数据绑定和控件赋值顺序会用不同
21. VS中编辑CSS文件,可以右键自动生成样式
22. <%...%> --->asp执行到该处会动态执行
<#%...%> --->进行绑定,但不会动态执行,只有进行Bind() 期间,才会解释
23. 如果一个aspx中多个ADO控件分别绑定不同的DataSource,最好将除主控件以外的其他控件-->做成自定义控件,然后引入到该aspx中--->这样方便设计
24. fieldset/ legend --->容器的一种
25. ADO控件都有:
inserting事件--->可以用于对insert事件的数据进行更改
inserted事件--->在inserted中可以对要insert到库中的数据进行检查(可以规避事物的使用)
26.
a.如果想对ADO控件的数据显示部分的某个列进行精细的控制--->可以不使用默认的数据绑定模式--->而是使用模板列,例如:
<asp : TemplateField HeadText=..., sortExperssion=...>
<itemTemplate>
....
</itemTemplate>
</asp: TemplateField>
b. 使用模板列-->可以使用手动的<%..%>方式进行灵活的数据绑定
c.模板列非常强大-->可以内嵌asp指令和各种控件
e. 对于ADO控件中各个单元格可以和数据进行简单的绑定
27. 如果在已构建好的(用codesmith生成的)的BLL层中的各个业务类添加新的方法和需求--->可以在BLL层继承该业务类,然后再子类中添加相关的新业务和功能
---->这样就不用修改codesmith模板了
28. datalist 的显示方式
a | b | c |
d | e | f |
g |
29.
a.皮肤和样式-->都可以把页面的外观与数据分开
b.皮肤类似于样式--->可以使用页面aspx看起来更简洁--->见皮肤引用到外部(一般将皮肤和样式放在Theme主题中)
30. objectDatasource的机制步骤
selecting事件 ----------------->inserting事件
(其中选择数据的来源) (数据插入到objectDatas中)
-------------入口-------------------------------操作-----------------------
31.如果一个带ID的控件去hre(超链接)另外一个页面,那么该ID一般会作为quarystring--->传入下一个页面
32.一个button在操作buttonclick之前,可以加一个aspx "confirm()" 对话框--->以确保一些重要操作,例如:delete...操作的谨慎性
33. 删除主表的数据时,应先删除子表的引用数据,然后删除主表的数据,反之无所谓
34. &npb -->是一个空格
35. 在网页中对ADO空寂爱你进行修改的两种方式
a. 如果与页面控件元素无关,如故需要或缺页面元素--->就直接新建aspx,在新的页面中进行操作(例如:edit,insert)
b. 如果与页面元素有关,则--->不能再另一个页面中对原页面进行操作
c. 页面之间传递数据使用 context.request(quarystring) 方式进行,也可以使用viewstate传参数
36. 应用theme--->l类似于skin,css--->可以提高重用度,使Aspx代码更简洁
37.
a. 在ADO控件中,单元格可以和数据简单的绑定
b.也可以使用 <Templatefield>
<itemTemplate> //模板列的方式来更灵活和强大的展示数据