[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
转载请注明本文来自博客园 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
相关文章推荐
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 01 准备工作
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 05 表现层
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 06 用户界面层
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 02 业务逻辑层
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 04 数据访问层
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的WCF分层结构示例Step by Step —— 03 数据访问层
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的WCF分层结构示例Step by Step —— 05 Contracts
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的WCF分层结构示例Step by Step —— 02 Model的建立
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的WCF分层结构示例Step by Step —— 04 DataContract
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的WCF分层结构示例Step by Step —— 01 准备工作
- ASP.NET组件设计Step by Step(4)
- 一个小Forum Web程序示例,ASP.NET MVC Framework,总体结构介绍(Part 1)
- ASP.NET组件设计Step by Step(8)
- ASP.NET组件设计Step by Step(8)
- ASP.NET组件设计Step by Step(7)
- ASP.NET组件设计Step by Step(3)
- ASP.NET组件设计Step by Step(4)
- ASP.NET组件设计Step by Step(9)
- ASP.NET组件设计Step by Step(8)
- 使用ASP.Net WebAPI构建REST服务(一)——简单的示例