RSS

Monthly Archives: 五月 2004

Is this MVC ? Maybe… But I don’t think so…

这两天在CSDN的文档区翻到了一篇翻译的文章,《在ASP.NET中实现Model-View-Controller模式》,这篇文章是摘自鼎鼎大名的ESP,我想.NET程序员很少没有看过这本书的,说它是.NET程序员的Must-Read毫不为过(另一篇Must-Read是AppArc,即Application Architecture for .NET: Designing Applications and Services)。

回到这篇文章上来,原文在这里,Implementing Model-View-Controller in ASP.NET。我当初在看这部分的时候就相当疑惑,这里所描述的实现能否准确的称为MVC?

先看看大家熟悉得不能再熟悉的MVC的图示:

再看看ESP中对MVC模式的描述(如果感兴趣,可以看看最“正宗”的SmallTalk中MVC模式的描述,点这里):
It is important to note that both the view and the controller depend on the model. However, the model depends on neither the view nor the controller. This is one the key benefits of the separation. This separation allows the model to be built and tested independent of the visual presentation. The separation between view and controller is secondary in many rich-client applications, and, in fact, many user interface frameworks implement the roles as one object. In Web applications, on the other hand, the separation between view (the browser) and controller (the server-side components handling the HTTP request) is very well defined.

MVC模式有两点非常重要:1、Model完全独立于Controller和View;2、Controller独立于View的实现。上面对MVC的描述的最后一句话的意思是“ASP.NET中通过将View定义到页面文件,将Controller定义到Code-Behind组件中实现了Controller和View的分离”。

我不知道在这里ESP是怎么定义“separation”的含义的,如果Controller是通过“Front Controller”来实现,我还是认可达到了一定的分离度,但是如果Controller是通过“Page Controller”(也就是那个.aspx.cs的Code-Behind的模式)来实现的,我则对于是否真的这就算是“separation”表示怀疑。在这篇文章中,实现MVC就是用的Page Controller的方式。所以,我对于这篇文章中所示范的实现是否真正算是MVC方式表示严重怀疑。

作为一个真正的MVC的系统,Model和Controller因为从View中独立了出来,所以具有非常高的重用性,比如,如果将作为View的页面进行修改,或者干脆把现有的页面文件删除然后再做过新的页面,或者将程序的界面从ASP.NET页面改成一个WinForms程序,甚至改为一个Mobile设备上的程序,Model和Controller仍然是可重用的,就是说,界面背后的数据、流程、状态控制、业务规则都是一样的,所以View的变换决不会影响Model和Controller。

对于一个MVC实现的系统来说,实现上面这一点应该是基本的需求,而且也是MVC的初衷(把View从Model和Controller中解藕出来,View的变化不影响其他部分)。而上文所提到的那样的实现方式,我看不出能够达到MVC所需要达到的要求。

就我所知,现在.NET下真正实现了MVC的框架只有两个:SourceForge上的Maverick和微软的UIPAB,利用它们提供的Framework,可以真正的同时很方便的实现MVC的Application。如果有时间,我希望不久能以UIPAB为基础,写一篇如果实现MVC模式的WebForms程序的文章。

 

Posted by on 2004/05/28 in 未分类

4 Comments

Tags: ,

TechEd2004

TechEd2004进行到了第三天。下面是一些TechEd Session的记录:

SQL Server 2005 CLR Integration
Source Control for Team Foundation, Presentation
SQL Server 2005 Web Services
SQL Server 2005 Whistle Stop Tour
Visual Studio 2005 Team System: Software Project Management
Inside IIS and ASP.NET: Intercepting HTTP Requests
Tracing with WSE 2.0
The Difficulties of Language Design
SO Prescriptive Guidance
The Don & Doug Show

如果想了解更多TechEd2004的讲座的内容,不要错过TechEd2004的Blog站点:TechEdBloggers.Net

当然,TechEd2004的官方站点里面也包含了丰富的内容,特别是图片库,可以让我们感受到TechEd现场的气氛。

令人感兴趣的是,Sohu的IT频道特地开了一个TechEd2004专栏,通过一个现场的记者在跟踪报导TechEd2004的盛况。看看这篇:非程序员眼中的InfoPath,很有意思。

 

Posted by on 2004/05/27 in 未分类

1 Comment

Tags:

ASP.NET Tips : 用JS产生Postback

用Page.GetPostBackEventReference()方法可以返回一个产生Postback的JS Method,不再详叙。这里演示如何Postback以后知道是哪个元素触发的Postback。

在页面上:

…onClick=”javascript:”…

在页面的Page_Load()里面:

if (this.IsPostBack)
{
??? String eventArg = Request[ “__EVENTARGUMENT” ];
??? if (eventArg.IndexOf(“@@@@@” ) > -1)……
}

Source : http://weblogs.asp.net/mnolton/archive/2003/06/04/8260.aspx

 

Posted by on 2004/05/26 in 未分类

1 Comment

Tags:

Visual Studio 2005 Team System

正在美国如火如荼的进行的TechEd2004上,伴随着新发布的VS2005 CTP?May2004版本,众人瞩目的焦点已经从ObjectSpace、Generic、ASP.NET 2.0、WhiteHorse等等New Features转到了VS2005 Team System。

对于一个完整的开发平台而言,“开发生命周期管理”已经越来越被开发人员和软件公司所重视。Borland公司很早就突出自己可以在Define、Design、Develop、Test、Deploy、Manage等各个软件开发的过程提供一个完整的解决方案和工具集。

VS2005 Team System就是一个可以帮助软件开发团队降低开发面向服务的应用系统复杂性的开发生命周期平台,它提供了一系列的工具,将开发团队的成员紧密联系在一起,让开发过程更顺利,开发质量更稳定。

VS2005 Team System集成了Process Guidance、Prescriptive Architectures和Life-Cycle工具。它包含架构师版、开发人员版、测试人员版、团队协作版,分别着眼于对应的领域,解决对应的问题。

在TechEd2004上,与会者将会得到一个Team System的早期预览版(而且能装不能卸,就是说,除非重装你的系统…),今年夏天将发布的VS2005 Beta将包含Team System的一部分,正式版将在明年上半年随VS2005一同发布。

迅速了解VS2005 Team System的方法莫过于看看众多的视频Demo了:
Unit and Load Testing Demos
Source Code Control and Item Tracking Demo
Static Code Analysis Demos ?
Project Management Tools Demo
当然还有VS2005 Team System的官方站点

 

Posted by on 2004/05/25 in 未分类

5 Comments

Tags: ,

ObjectSpaces,See you in 2006…

最新的消息是,如同MBF一般,ObjectSpaces将与Longhorn最新的存储框架WinFS融合在一起,就是说,它已经从VS2005的计划中被移除了,并推迟到2006(or 2007)与Longhorn(Oracs)同时推出。

这个消息被发布在http://msdn.microsoft.com/data,并已经在ObjectSpaces的新闻组上被证实了。相信很快会在MS相关员工的Blog上被证实。

 

Posted by on 2004/05/23 in 未分类

3 Comments

Tags: ,

CLR如何实现线程同步

为了实现线程同步,基本的思想无非是:为每个对象保留一块数据区域,这块数据区域用于这个相关对象的线程同步的锁定、判断、释放等操作。在Win32里面,通常都会用到一个“CRITICAL_SECTION”结构。

CLR实现线程同步的方式大同小异,唯一有所区别的是,为每个Object保留一块那样的区域有些浪费,因为很多Object不需要考虑线程同步,所以,CLR用了一个优化的手段。

当CLR开始进行初始化工作时(通常这时CLR刚被载入),它分配一块内存,有点类似一个数组,叫做SyncBlock Cache,这个缓存里面的每个元素就是前面说到的那个用来实现线程同步的区域(CLR里面叫SyncBlock),CLR先创建出一段这样的Cache,这样当有一个Object需要实现线程同步时,CLR就从这段Cache里面找一个空闲的SyncBlock给那个对象用。

在CLR在Heap里面创建一个对象时,会给这个对象创建两个额外的区域。第一个区域就是这个对象的MethodTablePointer,包含这个对象所有方法的指针。当我们调用一个对象的GetType()方法时,这个方法也是通过检测这个MethodTablePointer来确定这个对象的确切类型的。第二个区域就是一个索引数,指向CLR管理的SyncBlock Cache列表中的某一项。

最开始,这个索引数是一个负数,表示这个对象不需要线程同步。当CLR发现这个对象开始需要线程同步时(通常是看到了lock指令之类的),就从SyncBlock Cache中找一个空闲的SyncBlock,然后把它的索引数值放在前文所说的那个对象的第二个区域里面。当需要线程同步的代码执行完成了,这个索引数又被重新赋值为负数。

 

Posted by on 2004/05/21 in 未分类

1 Comment

Tags:

Using 1.1, Waiting 2.0 & EasyThread

一、Using 1.1, Waiting 2.0

和其他所有的.NET程序员一样,我一边期待着.Net 2.0早日发布,并关注着它的各种新特性,一边仍然基于.Net 1.1在实现着各种各样的项目或产品。

很自然的,我希望我能在ASP.NET 1.1里面就能享受到这些能帮我更快更方便的编程的新东东。其实很多人已经在把2.0下面的新特性在1.1下面实现出来,比如Provider PatternsMaster PageThemeImage ManagementSqlCache Dependency(RobHoward也用HttpHandler实现过一个,点这里下载)、PersonalizationObjectSpaces

其实我最期待的是WebPart在1.1下面的实现,但个人估计难度太大,可能不太现实(虽然Dino Esposito提过有这个计划)…

二、EasyThread

微软内部一个哥们儿做了一个EasyThread的VS.NET的Add-in,只要在一个方法前面加上一个Attribute,这个Add-in就会在编译时自动生成代码,让这个方法在另外一个线程里面运行。轻轻松松将原本单线程的程序变为多线程。

这个东东还有以前说过的那个XC#启发了我一个思路,它们都是利用VS.NET的Add-in能力,通过在源码中插入特定的Attribute,然后在编译时自动查找这些Attribute然后插入特定的代码以实现一些原本C#语法不能实现的功能。那么干嘛不用类似的方式,来实现AOP呢?将AOP的实现从运行时移到编译时…这个Idea还有待证实…

三、Snippet Compiler

介绍一个小工具,Snippet Compiler,它的好处是让我们有时候只想验证某个想法而只需要写上几行代码的时候无需打开VS.NET新建一个项目,但又比EditPlus之类的要强大一点点。

 

Posted by on 2004/05/20 in 未分类

8 Comments

Tags:

开发SharePoint中的定制流程动作

上一篇文章里面,我发布了一个SharePointWorkflow引擎。其中提到了用户可以根据自己的要求,自己定制需要的流程动作,并插入到流程定义文件中。这篇文章演示了如何开发定制的流程动作:给一个指定的Email地址发送一封邮件,告知有新的报告来了

 

打开VS.NET,新建一个“类库”项目,在项目中加入两个Assembly的引用:Kaneboy.SPSWorkflow.dllMicrosoft.SharePoint.dll

 

编写自定义流程动作,其实就是创建一个从Kaneboy.SPSWorkflow.Actions.ActionBase继承下来的类,并override继承的DoAction()方法。

 

Kaneboy.SPSWorkflow.Actions.ActionBase提供了多个protected的属性,这些属性公开了与这个流程动作相关的一些信息:

Web : 当前的SPS站点

List : 当前这个文件所在的文档库

User : 执行这个动作的用户

File : 当前的文件

ListItem : 当前文件相关的列表项

Parameter : 从流程定义文件中传入的参数的值,比如流程定义文件中对于这个动作的定义是“<action ns="Tencent" prefix="st1" Assembly="”C:/SPSWorkflowActionSample.dll” Type=”SPSWorkflowActionSample.SendEmail” Parameter=”kaneboy@kaneboy.com” />”,那么这里的Parameter属性值就是“kaneboy@kaneboy.com”

 

现在开始创建这个流程动作类:

public class SendEmail : Kaneboy.SPSWorkflow.Actions.ActionBase

 

然后重写父类的DoAction()方法:

public override Microsoft.SharePoint.SPFile DoAction()

{

MailMessage mailMsg = new MailMessage();

// 邮件的发件信箱就是当前用户的Email,这个EmailSPS站点用户的信箱

mailMsg.From = this.User.Email;

// 邮件的收件信箱从动作参数中获得

mailMsg.To = this.Parameter;

// 邮件的主题和正文从当前用户和当前文件中获得相应信息

mailMsg.Subject = this.User.Name + “提交了一篇新的报告:” + this.File.Name;

mailMsg.Body = mailMsg.Subject;

 

try

{

       // 这个例子假设可以在本机通过CDOSYS发送邮件

SmtpMail.SmtpServer = “127.0.0.1”;

SmtpMail.Send(mailMsg);

}

finally

{

}

 

       // 除非对当前文件做了移动操作,否则返回null即可。

return null;

}

 

编译,得到一个dll文件,然后将dll文件放置到SPS服务器的某个位置。参看这个流程定义文件,如果我们要在报告移到部门经理报告库后自动发送一封邮件给经理,那么在

 

<action Assembly="" Roman?? New ?Times mso-hansi-font-family: Roman?; mso-ascii-font-family: 宋体; FONT-FAMILY: Parameter="

<Action Assembly=”” Type=”Kaneboy.SPSWorkflow.Actions.Move” Parameter=”部门经理报告库” />

 

的后面再添加一行:

 

<action Assembly="C:/SPSWorkflowAction

<Action Assembly=”C:/SPSWorkflowActionSample.dll” Type=”SPSWorkflowActionSample.SendEmail” Parameter=”receiver@mail.com” />

 

Assembly属性的值就是编译得到的dll文件的绝对路径,Type属性的值是动作类的名称,Parameter属性的值就是收件人的信箱。

完整的项目源码点击这里下载。

 

Posted by on 2004/05/18 in 未分类

12 Comments

Tags:

SharePoint 站点模版

如果想找一些现成的SharePoint站点模版,请查看下面的下载链接:

模版类型:保险法律会计金融财务中学人力资源营销政府机构医院医生房地产

不少朋友都拿到Longhorn 4074版本了吧?请查看:如何在Longhorn 4074上安装VS2005 Community Tech Preview版本

 

Posted by on 2004/05/18 in 未分类

15 Comments

Tags:

Data…

因为这几天在评估公司一个项目应用ASP.NET 2.0一些新特性的情况,所以对.Net Fx 2.0的一些特性又着重了解了一下。

这里是Dino写的一篇回顾Microsoft的数据访问技术的文章,其中展望了ADO.NET 2.0将带来的一些新的特性。这里是一篇内容更加丰富的描述ADO.NET 2.0新特性的文章。这里是PDC03会议上面的一个ppt演示。

从它们带来的信息看,ADO.NET 2.0的不少新特性非常令人期望。Provider Factory、XmlAdapter、Paging Fill Data、Server Cursor、Asynchronous Connection and Command、Bulk Copy等等,当然还有ObjectSpace。

当然,这些信息都已经是比较“古老”的信息了,根据最新的信息显示,原先计划的不少新特性会最终去掉。前几天Dino的Blog上已经对此作出了说明,包括我比较喜欢的Paging…

我现在最大的希望是6月份VS2005 Beta能够如期推出,并希望这个Beta版本和Final Release的差别不要太大(但从Beta到明年Release这么长的一段时间间距使得这个希望有点悬)。

ps1:这两天正在考虑实现一个SharePointDataProvider,让程序员可以通过标准的ADO.NET接口访问SharePoint List中的数据。带来的一个额外好处就是不少报表软件能够更方便的显示SharePoint中的内容了。

ps2:今天收到了Longhorn DVD光盘和MVP eLearning Kit,eLearning Kit上面有几本不错的开发方面的书(Coding Techniques for Microsoft Visual Basic .NET、Designing Enterprise Applications with Microsoft Visual Basic .NET、OOP: Building Reusable Components with Microsoft Visual Basic .NET、Practical Standards for Microsoft Visual Basic .NET、Programming Microsoft Windows with Microsoft Visual Basic .NET(没错,这本就是Charles Petzold写的那本书的VB版本)),可惜都是VB.NET的…

 

Posted by on 2004/05/17 in 未分类

2 Comments

Tags: ,