您的位置:首页 > 编程语言 > ASP

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 03 服务层

2011-02-01 00:36 916 查看
注:本例来自图书Professional ASP.NET Design Pattern,该书的亚马逊链接为:http://www.amazon.com/Professional-ASP-NET-Design-Patterns-Millett/dp/0470292784/ref=sr_1_1?ie=UTF8&qid=1296479229&sr=8-1

转载请注明本文来自博客园 http://www.cnblogs.com/charrli

服务层的作用是是给表现层提供一个完全契合表现需要的视图模型(view model),有时候我们把它叫做表现模型。服务层的典型架构就是将表现层提供的请求包装为Request,而将返回给Presentation层的响应包装为Response。而在Response里返回的视图模型,已经是完全契合表现需要的,从业务逻辑层得到的Product类的对象转换而来的视图类的对象。

服务层Service Layer是典型的立面模型(facade pattern)的设计模式。所谓立面模型,就是指将复杂的接口和子系统包装为简单的接口和控制方法。

1. ProductViewModel


public class ProductViewModel
{
public int ProductId { get; set; }
public string Name { get; set; }
public string RRP { get; set; }
public string SellingPrice { get; set; }
public string Discount { get; set; }
public string Savings { get; set; }
}

ProductViewModel是Service Layer向上层返回数据时内部使用的对象的类型。可见,该类型已经完全按照表现层进行设计,而不是数据库表本身的格式了。

同时注意ProductViewModel里面使用的Property而不是Field,如果使用Field,程序最后将出现绑定错误,因为使用Field的对象将会导致Eval或者Bind找不到相应的值。


2. ProductListRequest


public class ProductListRequest
{
public CustomerType CustomerType { get; set; }
}

可见Request非常简单,就是包裹了一个CustomerType而已。这是用户唯一可以向后台传单的数据。


3. ProductListResponse



public class ProductListResponse
{
public bool Success { get; set; }
public string Message { get; set; }
public IList<ProductViewModel> Products { get; set; }
}

Response的设计非常简单。如果成功,则返回ProductViewModel的集合。如果不成功,则返回错误信息。


4. ProductMapperExtensionMethods


public static class ProductMapperExtensionMethods
{
public static IList<ProductViewModel> ConvertToProductListViewModel(this IList<Model.Product> products)
{
IList<ProductViewModel> productViewModels = new List<ProductViewModel>();

foreach(Model.Product p in products)
{
productViewModels.Add(p.ConvertToProductViewModel());
}

return productViewModels;
}

public static ProductViewModel ConvertToProductViewModel(this Model.Product product)
{
ProductViewModel productViewModel = new ProductViewModel();
productViewModel.ProductId = product.Id;
productViewModel.Name = product.Name;
productViewModel.RRP = String.Format("{0:C}", product.Price.RRP);
productViewModel.SellingPrice = String.Format("{0:C}", product.Price.SellingPrice);

if (product.Price.Discount > 0)
productViewModel.Discount = String.Format("{0:C}", product.Price.Discount);

if (product.Price.Savings < 1 && product.Price.Savings > 0)
productViewModel.Savings = product.Price.Savings.ToString("#%");

return productViewModel;
}
}

这里ExtensionMethods的作用是把通过Model的ProductService取得的Model.Product类型的集合,转换成ProductViewModel类型的集合。


5. ProductService


private Model.ProductService _productService;

public ProductService(Model.ProductService ProductService)
{
_productService = ProductService;
}

public ProductListResponse GetAllProductsFor(ProductListRequest productListRequest)
{
ProductListResponse productListResponse = new ProductListResponse();

try
{
IList<Model.Product> productEntities = _productService.GetAllProductsFor(productListRequest.CustomerType);

productListResponse.Products = productEntities.ConvertToProductListViewModel();
productListResponse.Success = true;
}
catch (System.Data.SqlClient.SqlException ex)
{
// Log the exception...

productListResponse.Success = false;
// Return a friendly error message
productListResponse.Message = "Check that your database is in the correct place. Hint: Check the AttachDbFilename section within App.config in the project ASPPatterns.Chap3.Layered.Repository.";
}
catch (Exception ex)
{
// Log the exception...

productListResponse.Success = false;
// Return a friendly error message
productListResponse.Message = "An error occured";
}

return productListResponse;
}

}

ProductService是利用ProductListRequest里面的CustomerType的类型,传入业务逻辑层提供的Model.ProductService的方法,构造成ProductListResponse返回给表现层。


经过以上5个步骤,Service Layer就边写完了。下面进行数据访问层Data Access Layer。

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 01 准备工作
/article/6133832.html

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 02 业务逻辑层
/article/6133833.html

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 03 服务层
/article/6133834.html

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 04 数据访问层
/article/6133835.html

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 05 表现层
/article/6133836.html

[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 06 用户界面层
/article/6133837.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐