走向ASP.NET架構設計——第三章:分層設計,初涉架構(后篇)

作者: 小洋(燕洋天)  來源: 博客園  發布時間: 2010-11-07 20:44  閱讀: 1018 次  推薦: 0   原文鏈接   [收藏]  

  接上篇

  4.數據訪問層設計 

  數據訪問層,這塊要說的不多。但是要澄清一點:數據訪問不一定就是訪問數據庫,雖然多數的情況下,我們確實把數據存儲在數據庫中。

  這里我們用數據庫存儲數據,并且用Linq To Sql來進行數據訪問操作。

  下面我們就來實現數據操作的一些代碼: 

 
public class ProductRepository : IProductRepository
{

public IList<Model.Product> FindAll()
{
var products
= from p in new ShopDataContext().Products
select
new Model.Product
{
Id
= p.ProductId,
Name
= p.ProductName,
Price
= new Model.Price(p.RRP, p.SellingPrice)
};


return products.ToList();
}
}

  5. 顯示層設計

  我們這里用Model-View-Presenter模式把顯示邏輯從UI層中分離出來,成為顯示層。其實這樣做的好處:方便單元測試,同時也讓我們可以換不同的View來顯示,例如我們可以換成aspx的頁面顯示,也可以用WinForm來顯示。關于MVP的詳細知識,我會在后續的文章中后慢慢的講述,本篇只是”初涉架構”----相當于把后續文章的知識都提了一下。

  通過看代碼來講述。我們在ASPPatterns.Chap3.Layered.Presentation項目加入一個接口類:IProductListView

 
public interface IProductListView
{

void Display(IList<ProductViewModel> Products);
Model.CustomerType CustomerType {
get; }
string ErrorMessage { set; }
}

  這個接口會被ASPX的Web Form來實現。下面我們就來創建一個ProductListPresenter來連接View和Service。Presenter負責把數據從service拿來,然后交給View去顯示。代碼如下: 

 
public class ProductListPresenter
{

private IProductListView _productListView;
private Service.ProductService _productService;

public ProductListPresenter(IProductListView ProductListView, Service.ProductService ProductService)
{
_productService
= ProductService;
_productListView
= ProductListView;
}


public void Display()
{
ProductListRequest productListRequest
= new ProductListRequest();
productListRequest.CustomerType
= _productListView.CustomerType;

ProductListResponse productResponse
= _productService.GetAllProductsFor(productListRequest);

if (productResponse.Success)
{
_productListView.Display(productResponse.Products);
}

else
{
_productListView.ErrorMessage
= productResponse.Message;
}

}
}

  這樣實現之后,我們現在就可以編寫一些測試的代碼來測試數據取的是否正確,此時我們不一定非得用頁面的顯示才知道數據的正確性。而且這樣實現的好處之前也提過:我們可以把數據給WPF的界面顯示,或者給WinForm的界面顯示。 

  6.UI層設計

  最后不管怎么樣,我們還是需要顯示一下數據的。界面如下:

  ASPX頁面的代碼如下: 

 
public partial class _Default : System.Web.UI.Page, IProductListView
{

private ProductListPresenter _presenter;

protected void Page_Init(object sender, EventArgs e)
{
_presenter
= new ProductListPresenter(this, ObjectFactory.GetInstance<Service.ProductService>());
this.ddlCustomerType.SelectedIndexChanged += delegate { _presenter.Display();};
}



protected void Page_Load(object sender, EventArgs e)
{

if (Page.IsPostBack != true)
_presenter.Display();
}


public void Display(IList<ProductViewModel> Products)
{
rptProducts.DataSource
= Products;
rptProducts.DataBind();
}


public CustomerType CustomerType
{

get { return (CustomerType)Enum.ToObject(typeof(CustomerType), int.Parse(this.ddlCustomerType.SelectedValue) ); }
}



public string ErrorMessage
{

set { lblErrorMessage.Text = String.Format("<p><strong>Error</strong><br/>{0}<p/>", value); }
}

}

  希望大家看到上面一堆代碼不要暈,下面就通過一個圖來講述一下整個流程:  

  Page在頁面的初始化的時候創建一個ProductListPresenter的實例,并且我們通過StructureMap的ObjectFactory.GetInstance方法得到了一個門戶的ProductService。Default頁面把任何對他的事件的調用委托給了Presenter,也就是說,我們基本上不在Default的頁面代碼后面做什么邏輯處理,這一切都放在Presenter里面。 

  最后我們設計的結構就很利于測試和維護,也有很強的擴展性。 

  本篇(前。中,后篇)就到這里了,還是那句話:把三篇連在一起看,多琢磨下代碼,有什么問題大家可以留言!多謝支持! :)

0
0
 
標簽:ASP.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()