走向.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 ; }
}
 
    这个接口会被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 里面。 
 
       最后我们设计的结构就很利于测试和维护,也有很强的扩展性。 
  本篇(前。中,后篇)就到这里了,还是那句话:把三篇连在一起看,多琢磨下,有什么问题大家可以留言!多谢支持! :)





















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

相关文章
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
176 6
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
65 1
|
8天前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
49 26
|
14天前
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
57 10
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
50 3
|
3月前
|
消息中间件 运维 数据库
架构设计之解析CQRS架构模式!
架构设计之解析CQRS架构模式!
架构设计之解析CQRS架构模式!
|
3月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
134 0
|
5月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
75 5
|
5月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
125 1
|
5月前
|
监控 安全 中间件
Python Django 后端架构开发: 中间件架构设计
Python Django 后端架构开发: 中间件架构设计
58 1

热门文章

最新文章