[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 03 服务层
注:本例来自图书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 准备工作
http://www.cnblogs.com/charrli/archive/2011/01/31/1948483.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 02 业务逻辑层
http://www.cnblogs.com/charrli/archive/2011/01/31/1948504.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 03 服务层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948521.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 04 数据访问层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948523.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 05 表现层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948554.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 06 用户界面层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948563.html