首页 > 编程 > .NET > 正文

在ASP.NET中实现Model-View-Controller模式(2)

2024-07-10 13:10:52
字体:
来源:转载
供稿:网友

  模型-视图-控制器分离的重构

 为了解决上面所遗留的问题,你必须将模型与控制器角色分离。

 视图的实现代码与前部分相同。

 模型

 下面的代码例子使模型角色仅仅依赖于数据库,而不包含任何与视图相依赖的代码。

using system;

using system.collections;

using system.data;

using system.data.sqlclient;

public class databasegateway

{

public static dataset getrecordings()

{

string selectcmd = "select * from recording";

sqlconnection myconnection =

new sqlconnection(

"server=(local);database=recordings;trusted_connection=yes");

sqldataadapter mycommand = new sqldataadapter(selectcmd, myconnection);

dataset ds = new dataset();

mycommand.fill(ds, "recording");

return ds;

}

public static dataset gettracks(string recordingid)

{

string selectcmd =

string.format(

"select * from track where recordingid = {0} order by id",

recordingid);

sqlconnection myconnection =

new sqlconnection(

"server=(local);database=recordings;trusted_connection=yes");

sqldataadapter mycommand = new sqldataadapter(selectcmd, myconnection);

dataset ds = new dataset();

mycommand.fill(ds, "track");

return ds;

}

 现在的代码只依赖于数据库,这个类是一个优秀的数据库的通道,它持有访问表或视图的所用的sql语句,其它的代码调用一些方法来完成与数据库的交互。

 控制器

 这种重构方式利用代码隐藏机制,在负责数据访问的模型部分相对独立的情况下,由控制器负责事件与方法的控制工作。模型的任务很明确的,它仅返回一个dataset对象。这种实现方式就像视图代码一样,不依赖于数据是如何从数据库中返回的。

using system;

using system.data;

using system.collections;

using system.web.ui.webcontrols;

public class solution : system.web.ui.page

{

protected system.web.ui.webcontrols.button submit;

protected system.web.ui.webcontrols.datagrid mydatagrid;

protected system.web.ui.webcontrols.dropdownlist recordingselect;

private void page_load(object sender, system.eventargs e)

{

if(!ispostback)

{

dataset ds = databasegateway.getrecordings();

recordingselect.datasource = ds;

recordingselect.datatextfield = "title";

recordingselect.datavaluefield = "id";

recordingselect.databind();

}

}

void submitbtn_click(object sender, eventargs e)

{

dataset ds =

databasegateway.gettracks(

(string)recordingselect.selecteditem.value);

mydatagrid.datasource = ds;

mydatagrid.databind();

}

#region web form designer generated code

override protected void oninit(eventargs e)

{

//

// codegen: this call is required by the asp.net web form designer.

//

initializecomponent();

base.oninit(e);

}

/// <summary>

/// required method for designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void initializecomponent()

{

this.submit.click += new system.eventhandler(this.submitbtn_click);

this.load += new system.eventhandler(this.page_load);

}

#endregion

}

   测试

 将模型部分从asp.net环境中分离出来能够使模型部分更容易的被测试。在asp.net环境中进行测试的话,你必须同时测试很多方面,如html代码是否正确,而读取html代码的工作是非常烦闷的。将模型部分分离出来,使你能够对模型部分做单独的单元测试。下面是nunit (http://nunit.org)对模型部分进行单元测试的例子。

using system;

using nunit.framework;

using system.collections;

using system.data;

using system.data.sqlclient;

[testfixture]

public class gatewayfixture

{

[test]

public void tracks1234query()

{

dataset ds = databasegateway.gettracks("1234");

assertion.assertequals(10, ds.tables["track"].rows.count);

}

[test]

public void tracks2345query()

{

dataset ds = databasegateway.gettracks("2345");

assertion.assertequals(3, ds.tables["track"].rows.count);

}

[test]

public void recordings()

{

dataset ds = databasegateway.getrecordings();

assertion.assertequals(4, ds.tables["recording"].rows.count);

datatable recording = ds.tables["recording"];

assertion.assertequals(4, recording.rows.count);

datarow firstrow = recording.rows[0];

string title = (string)firstrow["title"];

assertion.assertequals("up", title.trim());

}

}

 结论:

 在asp.net中实现mvc模式有如下优缺点:

 优势:

 能够减少依赖。 程序员可以在一个asp.net页面中实现所有的代码。单页的实现方式,对于一些小型的且生存周期不长的程序是适用的。但如果想在不断增加的页面间共享代码的话,将代码的不同部分进行分离是非常有效果的。

 能够减少代码的复制。 databasegateway 类中的getrecordings 和 gettracks方法能够直接被其它的页面使用,减少了必须将方法的代码拷贝到不同页面的情况。

 能够把不同人员的责任分开。修改页面的外观与修改数据访问的代码所用的技术是不同的,将模型与视图分开能够使负责不同工作的专家协同的工作。

 使性能优化的成为可能 按将系统不同的职责分成不同的类,使性能的优化成为可能。前面的例子中,由于每次请求页面的时都要从数据库中读取数据。因此可在某种情况下将数据缓存,从而提高整个程序的性能。如果不将代码进行分离的话是无法做到的这点的。

 易测试性 将模型与视图相分离使在asp.net环境外进行单元测试成为可能。

 缺点:

 增加了代码的数量及复杂度。这个例子在早期单页的实现方式的基础上增加了新的文件和代码,在无形中增加了维护的开销。一旦修改系统的话,会修改所有三种角色的代码。在一些情况下,一个文件中的修改比一些文件中修改要方便。所以在考虑是否使用mvc模式时。这种额外的开销一定要被计算在内,对一些小的程序来说,这种开销是不值得的。



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表