Ilungasoft Framework是Teddy正在开发中的Web快速开发框架,该框架基于.Net 2.0,设计的出发点就是易用性,快速开发,兼顾性能。同时,Ilungasoft Framework也充分利用了许多.Net 2.0中的新特性以简化框架的易用性。本文将以一个Sample Web应用的分析为基础,介绍Ilungasoft Framework的使用。在本文中,您将看到,Ilungasoft Framework对Web开发的极大简化。
下载
如果想更直观的阅读本文及体验Ilungasoft Framework,建议您下载下面的文件:
Ilungasoft Framework dist v1.0 beta with Sample
Sample解析
1. Web.config
Web.config非常简单,除了基本的配置项,分别介绍一下手动增加的内容:
1)Line 3- 5 and line 21-26. 这几行设置用于实现UrlRewrite的section。
这里的UrlRewriteRules,采用标准的正则表达式来进行rewrite。也就是说key代pattern,value则是替换字符串。
另外注意Line 7. 这一行设置了web程序的基目录,如果程序不启用UrlRewrite,则可以忽略这个设置项,否则则建议设置。一旦设置RootUrl,并在Global.asax中将其load到Ilungasoft.Framework.Web.UI.Page.RootUrl这个静态实例,就能通过Ilungasoft.Framework.Web.UI下的Page, UserControl, MasterPage类的ParseUrl()方法,在运行时计算链接的真实路径,而不必担心UrlRewrite可能带来的路径错乱问题。请在Sample程序中搜索ParseUrl,并查看Global.asax文件,查看实际的使用方法。
2)Line 9-11. 设置Connection String. 值得注意的是,如果访问SqlServer,则ProviderName必须设为Ilungasoft.Framework.Data.SqlServer.SqlDbProvider,如果是MsAccess则设为Ilungasoft.Framework.Data.MsAccess.AccessDbProvider。
2. App_Code
1)Facade.cs和CachableFacade只是对Ilungasoft.Framework.Data.Facade下的Gateway和CachableGateway的简单继承,这样的继承并不必须,但是继承以后,由于ASP.NET2.0中的一个Web应用是没有命名空间的。就可以在page的code-behind中以Facade.XXX这样的方式调用组件中的方法,而不需在每个页面都using命名空间或者用完整路径访问了。
2)同样的,Entity.cs也是起到一个简化命名空间的作用,只需将Framework.Tools.EntityGen.exe生成的实体类粘贴至这里就行,当然,自定义的实体类也可以定义在这里。例如:
3. 页面
MasterPage.master和Default.aspx都很简单,只是可以根据需要继承Ilungasoft.Framework.Web.UI下的Page, UserControl, MasterPage类。关于这些基类的更详细的介绍,可以参见 Asp.Net 2.0 开发加速之 - Ilungasoft.Helper.Web.UI.MasterPage/Page/UserControl 精装版 。
注意SampleUserControl.ascx这个控件中的Repeater控件,这里唯一值得一提的就是StrongTyped<>方法,它提供了简单(强类型,基类扩展)高效(避免反射)的数据绑定语法。
下面再具体列举一下对应的SampleUserControl.ascx.cs。
Line 20首先演示了如何通过Facade从数据库读取记录。Facade中定义了所有常用数据库操作,这些操作都将返回强类型的变量,实体类或集合。也包括了非常方便的分页查询支持,如Line 23获取每页5条记录的第三页。
Line 32演示了如何通过EntityFactory创建一个实体类实例。
Line 34-51演示了一个事务过程。
ok,是不是很简单呢?
这里只是演示了通过Facade读写数据库的方法,对于绝大多数查询,Facade足够了。如果您觉得不够灵活,请参见Teddy之前的另一篇文章 来一点反射,再来一点Emit —— 极度简化Entity!文中演示了Ilungasoft.Framework.Data下的另几个类SimpleDbAccess和SimpleDbHelper以及Database的调用示例,通过这些类提供了不同层面灵活访问数据库的能力。
关于Ilungasoft Framework更多文章介绍及后续更新,请参见 基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速Web开发框架设计(文章索引) 。
4. 其他
Sample中只是演示了Ilungasoft Framework最基本的功能,更多功能细节的使用我会陆续介绍。另外,您会注意到压缩包内包含的Framework.Tools.StringFormatHelper.exe这个工具,这个工具目前只有一个功能,就是将一段Javascript封装转换为一个字符串。用于编写web控件的,大家感兴趣可以试试。从网页复制js片断,点击按钮就行了。
//End
下载
如果想更直观的阅读本文及体验Ilungasoft Framework,建议您下载下面的文件:
Ilungasoft Framework dist v1.0 beta with Sample
Sample解析
1. Web.config
1
<?
xml version="1.0"
?>
2
<
configuration
>
3
<
configSections
>
4
<
section
name
="UrlRewriteRules"
type
="Ilungasoft.Framework.Web.Modules.UrlRewriteRules, Framework.Web"
/>
5
</
configSections
>
6
<
appSettings
>
7
<
add
key
="RootUrl"
value
="/Sample/"
/>
8
</
appSettings
>
9
<
connectionStrings
>
10
<
add
name
="DatabaseConnection"
connectionString
="Server=(local);Database=Northwind;Uid=sa;Pwd=sa"
providerName
="Ilungasoft.Framework.Data.SqlServer.SqlDbProvider"
/>
11
</
connectionStrings
>
12
<
system
.web
>
13
<
compilation
debug
="true"
>
14
<
assemblies
/>
15
</
compilation
>
16
<
authentication
mode
="Windows"
/>
17
<
httpModules
>
18
<
add
type
="Ilungasoft.Framework.Web.Modules.UrlRewriteModule, Framework.Web"
name
="UrlRewriteModule"
/>
19
</
httpModules
>
20
</
system.web
>
21
<
UrlRewriteRules
>
22
<!--
23
<Rule key="^/Category/(.+).html" value="/Category.aspx?ID=$1" />
24
<Rule key="^/(.+).html" value="/$1.aspx" />
25
-->
26
</
UrlRewriteRules
>
27
</
configuration
>
<?
xml version="1.0"
?>
2
<
configuration
>
3
<
configSections
>
4
<
section
name
="UrlRewriteRules"
type
="Ilungasoft.Framework.Web.Modules.UrlRewriteRules, Framework.Web"
/>
5
</
configSections
>
6
<
appSettings
>
7
<
add
key
="RootUrl"
value
="/Sample/"
/>
8
</
appSettings
>
9
<
connectionStrings
>
10
<
add
name
="DatabaseConnection"
connectionString
="Server=(local);Database=Northwind;Uid=sa;Pwd=sa"
providerName
="Ilungasoft.Framework.Data.SqlServer.SqlDbProvider"
/>
11
</
connectionStrings
>
12
<
system
.web
>
13
<
compilation
debug
="true"
>
14
<
assemblies
/>
15
</
compilation
>
16
<
authentication
mode
="Windows"
/>
17
<
httpModules
>
18
<
add
type
="Ilungasoft.Framework.Web.Modules.UrlRewriteModule, Framework.Web"
name
="UrlRewriteModule"
/>
19
</
httpModules
>
20
</
system.web
>
21
<
UrlRewriteRules
>
22
<!--
23
<Rule key="^/Category/(.+).html" value="/Category.aspx?ID=$1" />24
<Rule key="^/(.+).html" value="/$1.aspx" />25
-->
26
</
UrlRewriteRules
>
27
</
configuration
>
Web.config非常简单,除了基本的配置项,分别介绍一下手动增加的内容:
1)Line 3- 5 and line 21-26. 这几行设置用于实现UrlRewrite的section。
这里的UrlRewriteRules,采用标准的正则表达式来进行rewrite。也就是说key代pattern,value则是替换字符串。
另外注意Line 7. 这一行设置了web程序的基目录,如果程序不启用UrlRewrite,则可以忽略这个设置项,否则则建议设置。一旦设置RootUrl,并在Global.asax中将其load到Ilungasoft.Framework.Web.UI.Page.RootUrl这个静态实例,就能通过Ilungasoft.Framework.Web.UI下的Page, UserControl, MasterPage类的ParseUrl()方法,在运行时计算链接的真实路径,而不必担心UrlRewrite可能带来的路径错乱问题。请在Sample程序中搜索ParseUrl,并查看Global.asax文件,查看实际的使用方法。
2)Line 9-11. 设置Connection String. 值得注意的是,如果访问SqlServer,则ProviderName必须设为Ilungasoft.Framework.Data.SqlServer.SqlDbProvider,如果是MsAccess则设为Ilungasoft.Framework.Data.MsAccess.AccessDbProvider。
2. App_Code
1)Facade.cs和CachableFacade只是对Ilungasoft.Framework.Data.Facade下的Gateway和CachableGateway的简单继承,这样的继承并不必须,但是继承以后,由于ASP.NET2.0中的一个Web应用是没有命名空间的。就可以在page的code-behind中以Facade.XXX这样的方式调用组件中的方法,而不需在每个页面都using命名空间或者用完整路径访问了。
2)同样的,Entity.cs也是起到一个简化命名空间的作用,只需将Framework.Tools.EntityGen.exe生成的实体类粘贴至这里就行,当然,自定义的实体类也可以定义在这里。例如:
1
using
System;
2
using
System.Data;
3
using
System.Configuration;
4
using
System.Web;
5
using
System.Web.Security;
6
using
System.Web.UI;
7
using
System.Web.UI.WebControls;
8
using
System.Web.UI.WebControls.WebParts;
9
using
System.Web.UI.HtmlControls;
10
using
Ilungasoft.Framework.Common;
11
12
public
abstract
class
Entity
13
{
14
Paste Auto Generated Entities Here#region Paste Auto Generated Entities Here
15
16
public interface Region : IEntity
17
{
18
int RegionID
{ get; set; }
19
string RegionDescription
{ get; set; }
20
}
21
22
public interface Order_Details_Extended : IEntity
23
{
24
int OrderID
{ get; set; }
25
int ProductID
{ get; set; }
26
string ProductName
{ get; set; }
27
decimal UnitPrice
{ get; set; }
28
short Quantity
{ get; set; }
29
float Discount
{ get; set; }
30
decimal ExtendedPrice
{ get; set; }
31
}
32
33
#endregion
34
35
Add Custom Entities Here#region Add Custom Entities Here
36
37
#endregion
38
}
using
System;2
using
System.Data;3
using
System.Configuration;4
using
System.Web;5
using
System.Web.Security;6
using
System.Web.UI;7
using
System.Web.UI.WebControls;8
using
System.Web.UI.WebControls.WebParts;9
using
System.Web.UI.HtmlControls;10
using
Ilungasoft.Framework.Common;11

12
public
abstract
class
Entity13

{14

Paste Auto Generated Entities Here#region Paste Auto Generated Entities Here15

16
public interface Region : IEntity17

{18

int RegionID
{ get; set; }19

string RegionDescription
{ get; set; }20
}21

22
public interface Order_Details_Extended : IEntity23

{24

int OrderID
{ get; set; }25

int ProductID
{ get; set; }26

string ProductName
{ get; set; }27

decimal UnitPrice
{ get; set; }28

short Quantity
{ get; set; }29

float Discount
{ get; set; }30

decimal ExtendedPrice
{ get; set; }31
}32

33
#endregion34

35

Add Custom Entities Here#region Add Custom Entities Here36

37
#endregion38
}
3. 页面
MasterPage.master和Default.aspx都很简单,只是可以根据需要继承Ilungasoft.Framework.Web.UI下的Page, UserControl, MasterPage类。关于这些基类的更详细的介绍,可以参见 Asp.Net 2.0 开发加速之 - Ilungasoft.Helper.Web.UI.MasterPage/Page/UserControl 精装版 。
注意SampleUserControl.ascx这个控件中的Repeater控件,这里唯一值得一提的就是StrongTyped<>方法,它提供了简单(强类型,基类扩展)高效(避免反射)的数据绑定语法。
1
<
asp:Repeater
ID
="Repeater1"
runat
="server"
>
2
<
ItemTemplate
>
3
<%
# StrongTyped<Entity.Region>(Container.DataItem).RegionDescription
%>
<
br
/>
4
</
ItemTemplate
>
5
</
asp:Repeater
>
<
asp:Repeater
ID
="Repeater1"
runat
="server"
>
2
<
ItemTemplate
>
3

<%
# StrongTyped<Entity.Region>(Container.DataItem).RegionDescription
%>
<
br
/>
4
</
ItemTemplate
>
5
</
asp:Repeater
>
下面再具体列举一下对应的SampleUserControl.ascx.cs。
1
using
System;
2
using
System.Data;
3
using
System.Data.Common;
4
using
System.Configuration;
5
using
System.Collections;
6
using
System.Web;
7
using
System.Web.Security;
8
using
System.Web.UI;
9
using
System.Web.UI.WebControls;
10
using
System.Web.UI.WebControls.WebParts;
11
using
System.Web.UI.HtmlControls;
12
using
Ilungasoft.Framework.Common;
13
14
public
partial
class
controls_SampleControl : Ilungasoft.Framework.Web.UI.UserControl
15
{
16
protected void Page_Load(object sender, EventArgs e)
17
{
18
if (!IsPostBack)
19
{
20
Entity.Region[] regions = Facade.SelectAll<Entity.Region>();
21
Repeater1.DataSource = regions;
22
23
Entity.Order_Details_Extended[] orderDetails = Facade.Select<Entity.Order_Details_Extended>(5, 3, "[OrderID] > @OrderID", "[ProductID] desc", 0);
24
GridView1.DataSource = orderDetails;
25
26
DataBind();
27
}
28
}
29
protected void Button1_Click(object sender, EventArgs e)
30
{
31
int nextID = Facade.SelectScalar<int>("select max(RegionID) from [Region]");
32
Entity.Region newRegion = EntityFactory<Entity.Region>.CreateObject();
33
34
DbTransaction tran = Facade.BeginTransaction();
35
36
try
37
{
38
newRegion.RegionID = nextID + 1;
39
newRegion.RegionDescription = "new region - " + DateTime.Now.ToString();
40
Facade.Insert<Entity.Region>(newRegion, tran);
41
tran.Commit();
42
}
43
catch
44
{
45
tran.Rollback();
46
throw;
47
}
48
finally
49
{
50
Facade.CloseTransaction(tran);
51
}
52
53
Response.Redirect("Default.aspx");
54
}
55
}
using
System;2
using
System.Data;3
using
System.Data.Common;4
using
System.Configuration;5
using
System.Collections;6
using
System.Web;7
using
System.Web.Security;8
using
System.Web.UI;9
using
System.Web.UI.WebControls;10
using
System.Web.UI.WebControls.WebParts;11
using
System.Web.UI.HtmlControls;12
using
Ilungasoft.Framework.Common;13

14
public
partial
class
controls_SampleControl : Ilungasoft.Framework.Web.UI.UserControl15

{16
protected void Page_Load(object sender, EventArgs e)17

{18
if (!IsPostBack)19

{20
Entity.Region[] regions = Facade.SelectAll<Entity.Region>();21
Repeater1.DataSource = regions;22

23
Entity.Order_Details_Extended[] orderDetails = Facade.Select<Entity.Order_Details_Extended>(5, 3, "[OrderID] > @OrderID", "[ProductID] desc", 0);24
GridView1.DataSource = orderDetails;25

26
DataBind();27
}28
}29
protected void Button1_Click(object sender, EventArgs e)30

{31
int nextID = Facade.SelectScalar<int>("select max(RegionID) from [Region]");32
Entity.Region newRegion = EntityFactory<Entity.Region>.CreateObject();33

34
DbTransaction tran = Facade.BeginTransaction();35

36
try37

{38
newRegion.RegionID = nextID + 1;39
newRegion.RegionDescription = "new region - " + DateTime.Now.ToString();40
Facade.Insert<Entity.Region>(newRegion, tran);41
tran.Commit();42
}43
catch44

{45
tran.Rollback();46
throw;47
}48
finally49

{50
Facade.CloseTransaction(tran);51
}52

53
Response.Redirect("Default.aspx");54
}55
}
Line 20首先演示了如何通过Facade从数据库读取记录。Facade中定义了所有常用数据库操作,这些操作都将返回强类型的变量,实体类或集合。也包括了非常方便的分页查询支持,如Line 23获取每页5条记录的第三页。
Line 32演示了如何通过EntityFactory创建一个实体类实例。
Line 34-51演示了一个事务过程。
ok,是不是很简单呢?
这里只是演示了通过Facade读写数据库的方法,对于绝大多数查询,Facade足够了。如果您觉得不够灵活,请参见Teddy之前的另一篇文章 来一点反射,再来一点Emit —— 极度简化Entity!文中演示了Ilungasoft.Framework.Data下的另几个类SimpleDbAccess和SimpleDbHelper以及Database的调用示例,通过这些类提供了不同层面灵活访问数据库的能力。
关于Ilungasoft Framework更多文章介绍及后续更新,请参见 基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速Web开发框架设计(文章索引) 。
4. 其他
Sample中只是演示了Ilungasoft Framework最基本的功能,更多功能细节的使用我会陆续介绍。另外,您会注意到压缩包内包含的Framework.Tools.StringFormatHelper.exe这个工具,这个工具目前只有一个功能,就是将一段Javascript封装转换为一个字符串。用于编写web控件的,大家感兴趣可以试试。从网页复制js片断,点击按钮就行了。
//End

IlungasoftFramework是一款基于.Net2.0的Web快速开发框架,旨在提供易用性和性能的同时,简化Web应用程序的开发流程。本文通过一个示例应用介绍了框架的主要特点,包括URL重写配置、数据访问层的简化、强类型数据绑定等。
397

被折叠的 条评论
为什么被折叠?



