走向.NET架构设计—第三章—分层设计,初涉架构(后篇)

简介:
走向.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; }
}
 
   这个接口会被ASPXWeb Form来实现。
  下面我们就来创建一个ProductListPresenter来连接ViewServicePresenter负责把数据从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的实例,并且我们通过StructureMapObjectFactory.GetInstance方法得到了一个门户的ProductServiceDefault页面把任何对他的事件的调用委托给了Presenter,也就是说,我们基本上不在Default的页面代码后面做什么逻辑处理,这一切都放在Presenter里面。 
 
      最后我们设计的结构就很利于测试和维护,也有很强的扩展性。 
  本篇(前。中,后篇)就到这里了,还是那句话:把三篇连在一起看,多琢磨下,有什么问题大家可以留言!多谢支持! :)





















本文转自yanyangtian51CTO博客,原文链接:
http://blog.51cto.com/yanyangtian/412165
 ,如需转载请自行联系原作者

相关文章
|
2月前
|
设计模式 Java 应用服务中间件
Tomcat 架构原理解析到架构设计借鉴
Tomcat 架构原理解析到架构设计借鉴
123 0
|
2月前
|
存储 开发框架 前端开发
前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构
发展历史:实验室信息管理系统(LIMS),就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现代的管理思想有机结合,利用数据处理技术、海量数据存储技术、宽带传输网络技术、自动化仪器分析技术,来对实验室的信息管理和质量控制等进行全方位管理的计算机软、硬件系统,以满足实验室管理上的各种目标(计划、控制、执行)。
45 1
|
19天前
|
敏捷开发 Java 测试技术
「架构」模型驱动架构设计方法及其运用
本文探讨了MDA在软件开发中的应用,从需求分析到测试,使用UML建模功能需求,通过PIM设计架构,自动生成代码以减少错误。MDA提升了可维护性、可扩展性和可移植性,通过工具如Enterprise Architect和Eclipse MDT支持自动化转换。虽然有挑战,如模型创建和平台转换,但结合敏捷方法和适当工具能有效解决,从而提高开发效率和软件质量。
17 0
「架构」模型驱动架构设计方法及其运用
架构01-----抖音直播平台核心架构设计
架构01-----抖音直播平台核心架构设计
|
2月前
|
缓存 架构师 安全
架构篇:什么才是真正的架构设计?
特别特别厉害的一篇文章,今天无意中看到的,转载至CSDN的大佬hguisu的:blog.csdn.net/hguisu/article/details/78258430,谈到了作者对于架构的理解,我看完是真的受益匪浅。
|
2月前
|
存储 消息中间件 算法
深度思考:架构师必须掌握的五大类架构设计风格
数据流风格注重数据在组件间的流动,适合处理大量数据。调用返回风格则强调函数或方法的调用与返回,过程清晰明了。独立构件风格让每个构件独立运作,通过接口交互,提升灵活性和可重用性。虚拟机风格则模拟完整系统,实现资源的高效利用。
127 0
深度思考:架构师必须掌握的五大类架构设计风格
|
2月前
|
数据安全/隐私保护 Windows
.net三层架构开发步骤
.net三层架构开发步骤
|
2月前
深入.net平台的分层开发
深入.net平台的分层开发
|
9月前
|
算法 安全 Java
架构设计第十一讲:架构之高并发:限流
架构设计第十一讲:架构之高并发:限流
109 0
|
10月前
|
存储 缓存 架构师
程序员架构修炼:架构设计概要,业务、应用、技术、数据架构
架构设计 在架构设计过程中,我们会根据需要做出不同的架构设计,而在设计时需要涉及一定的架构设计核心要素。