2.4. 企业架构模式实战
还是继续本章开始的那个电子商务的例子:通过给定产品的分类获取所有的产品。下面我们要做的就产品展示。
要显示产品数据,最快速的做法就是建立一个ASP.NET的站点项目,新加一个页面,然后在页面上拖放GridView等类似的数据绑定控件,双击打开页面背后的类文件,敲上几行数据绑定的代码,这件事情就搞定了。如图2-10所示。
代码如下所示:
- private void BindProductsByCategoryId(intcategoryId)
- {
- var productService = new ProductService();
- this.gvProductList.DataSource = productService.GetAllProductsFrom(categoryId);
- this.gvProductList.DataBind();
- }
这种做法目前没有任何问题,值得提倡,简单就是美,够用就行,在业务和功能不复杂的情况下,它确实是可取方案!
但是如果需要在另一个页面上也显示商品列表,那么上面的所有操作几乎要重新做一遍:拖控件,写绑定代码。这里隐含的意思就是:功能相同或者相近的代码在多个地方出现。
在例子中,每次要想知道数据是否读取正确,只能通过运行程序来了解,缺乏可测试性。如果逻辑再复杂一点,页面再多一些,工作量就大了。
相信大家已经明白:此处,即将采用MVP模式。当然,这里没有给出足够的理由来说服大家为什么要采用这种模式,后续章节将会补上。
首先看看MVP模式的结构,如图2-11所示。
对于图2-11:
q View用来显示和收集用户输入的数据,并且把用户的请求传递给Presenter。
q Presenter充当一个中介者,向View隐藏了所有复杂的逻辑,只是暴露了一个简单的API供View调用,并且只要传入的对象实现了View的接口,Presenter都会将之看成View。
Model业务对象,接受Presenter传递过来的业务请求,真正处理业务逻辑是Model对象。
按照上面的结构,本例中MVP模式的实现结构如图2-12所示。
基于上述分析,MVP模式在Visual Studio中的实现如图2-13所示。
IProductView接口的定义如下:
- namespace AgileSharp.Chapter2.WebUI.Interface
- {
- public interface IProductView
- {
- void DisplayProducts(List<Product> data);
- }
- }
不管数据从哪里来,通过什么条件获取,这个接口的作用就是获取数据,然后显示。Default.aspx实现这个接口,如下:
- public partial class _Default :System.Web.UI.Page,IProductView
- {
- public void DisplayProducts(List<Product> data)
- {
- this.gvProductList.DataSource = data;
- this.gvProductList.DataBind();
- }
- }
如之前所示,ProductPresenter就是中介者,它传递请求,返回结果。如下所示:
- namespace AgileSharp.Chapter2.WebUI.Presenter
- {
- public class ProductPresenter
- {
- private ProductServiceproductService = null;
- privateIProductView view = null;
- publicProductPresenter()
- {
- productService = new ProductService();
- }
- public void Init(IProductView view)
- {
- this.view = view;
- }
- public void LoadProductsByCategory(intcategoryId)
- {
- var data = productService.GetAllProductsFrom(categoryId);
- if (data != null &&data.Count> 0)
- {
- this.view.DisplayProducts(data);
- }
- }
- }
- }
最后要做的就是将Presenter和View联系起来,如下:
- public partial class _Default :System.Web.UI.Page,IProductView
- {
- private ProductPresenter presenter = null;
- protected override void OnInit(EventArgs e)
- {
- base.OnInit(e);
- presenter = new ProductPresenter();
- }
- protected void Page_Load(object sender,EventArgs e)
- {
- if (!this.IsPostBack)
- {
- presenter.Init(this);
- }
- }
- public void DisplayProducts(List<Product> data)
- {
- this.gvProductList.DataSource = data;
- this.gvProductList.DataBind();
- }
- protected void ddlCategoryList_SelectedIndexChanged(object sender,EventArgs e)
- {
- int category = (int)this.gvProductList.SelectedValue;
- presenter.LoadProductsByCategory(category);
- }
- }
上述代码应该很清楚,这里就不再赘述,在第八章将会详细的讨论MVP模式等表现模式!
注意 完整的代码示例,可以参看AgileSharp.Chapter2文件夹。
当当地址:
京东地址:
卓越地址:
淘宝地址:
阅读(2784) | 评论(1) | 转发(0) |