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

來源:互聯網
上載者:User

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

  前言:本篇主要是接著前兩篇文章繼續講述!

  

本篇的議題如下:

4. 資料訪問層設計 

5. 顯示層設計

6. UI層設計

 

 

  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); }
        }
        
    }

  

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

Default

Page在頁面的初始化的時候建立一個ProductListPresenter的執行個體,並且我們通過StructureMap的ObjectFactory.GetInstance方法得到了一個門戶的ProductService。Default頁面把任何對他的事件的調用委託給了Presenter,也就是說,我們基本上不在Default的頁面代碼後面做什麼邏輯處理,這一切都放在Presenter裡面。 

      最後我們設計的結構就很利於測試和維護,也有很強的擴充性。 

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.