[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

posted on 2011-02-01 00:36  李志鹏  阅读(565)  评论(1)    收藏  举报

导航