使用StructureMap扩展ASP.NET MVC三层架构4-Controller和View的实现

终于到了MVC的UI层了,也终于要到StructureMap了,不容易啊。本篇文章介绍ASP.NET MVC三层架构中的Controller和View,以及系统中异常处理。

mvc-structuremap-controller

Controller和View

其实View没有什么介绍的,就是显示。本章的重点在Controller层,这一层需要注入Service层,同时会有异常处理,具体的异常处理的实现会在下篇文章介绍,本片只是说明一下怎么使用本系统中的异常处理类。

Controller

MVC中的Controller翻译过来是控制器,没错我们只用他来跳转,这里不存在任何的业务逻辑,仅仅向Service中传递View中的数据,然后Service处理业务并返回我们需要结果,之后进行跳转。为什么异常处理放在这里呢,因为我们需要把有好的错误信息返回到页面中,构建一个友好的页面交互。

BaseController的实现

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using TYStudioDemo.Interfaces;
  7.  
  8. namespace TYStudioDemo.WebUI.Controllers
  9. {
  10.     public abstract class BaseController : Controller
  11.     {
  12.          protected ITYExceptionService _tyExceptionService;
  13.  
  14.          public BaseController() { }
  15.  
  16.          public BaseController(ITYExceptionService tyExceptionService)
  17.          {
  18.              _tyExceptionService = tyExceptionService;
  19.          }
  20.     }
  21. }

每个单独的Controller都要继承自BaseController,BaseController中放入Controller中一般常用的Service,本系统只放入了ExceptionService,如果你在开发的时候发现很多Controller都需要注入相同的Service,没错把他们放到BaseController是一个很好地选择。

SupplierController

同样今天只介绍SupplierController的实现,其他举一反三~

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using TYStudioDemo.Interfaces;
  7. using TYStudioDemo.DTO;
  8.  
  9. namespace TYStudioDemo.WebUI.Controllers
  10. {
  11.     public class SupplierController : BaseController
  12.     {
  13.         ISupplierService _supplierService;
  14.  
  15.         public SupplierController(ITYExceptionService tyExceptionService,
  16.                                     ISupplierService supplierService)
  17.         {
  18.             _tyExceptionService = tyExceptionService;
  19.             _supplierService = supplierService;
  20.  
  21.         }
  22.  
  23.         public ActionResult Index()
  24.         {
  25.             return View(_supplierService.GetAll());
  26.         }
  27.  
  28.         public ActionResult Details(int id)
  29.         {
  30.             return View(_supplierService.GetByID(id));
  31.         }
  32.  
  33.         public ActionResult Create()
  34.         {
  35.             return View();
  36.         }
  37.  
  38.         [HttpPost]
  39.         public ActionResult Create(SupplierViewModel vModel)
  40.         {
  41.             ActionResult result;
  42.             try
  43.             {
  44.                 _supplierService.Create(vModel);
  45.                 result = RedirectToAction("Index");
  46.             }
  47.             catch(Exception ex)
  48.             {
  49.                 //定义Dictionary用来存储非法的对象
  50.                 //根据实际需求,添加相应的数据,也可以不填任何数据
  51.                 Dictionary<string, object> parms = new Dictionary<string, object>();
  52.  
  53.                 //返回错误信息,并将异常记入TYStudio_Logging数据库。
  54.                 ViewData["ErrorMessage"] = _tyExceptionService.HandleException(ex, parms, ex.Message);
  55.                 result = View(vModel);
  56.             }
  57.  
  58.             return result;
  59.         }
  60.  
  61.         public ActionResult Edit(int id)
  62.         {
  63.             return View(_supplierService.GetByID(id));
  64.         }
  65.  
  66.         [HttpPost]
  67.         public ActionResult Edit(SupplierViewModel vModel)
  68.         {
  69.             try
  70.             {
  71.                 _supplierService.Update(vModel);
  72.                 return RedirectToAction("Index");
  73.             }
  74.             catch
  75.             {
  76.                 return View();
  77.             }
  78.         }
  79.  
  80.         public ActionResult Delete(int id)
  81.         {
  82.             return View(_supplierService.GetByID(id));
  83.         }
  84.  
  85.         [HttpPost]
  86.         public ActionResult Delete(int id, FormCollection collection)
  87.         {
  88.             try
  89.             {
  90.                 _supplierService.Delete(id);
  91.                 return RedirectToAction("Index");
  92.             }
  93.             catch(Exception ex)
  94.             {
  95.                 //定义Dictionary用来存储非法的对象
  96.                 //根据实际需求,添加相应的数据,也可以不填任何数据
  97.                 Dictionary<string, object> parms = new Dictionary<string, object>();
  98.  
  99.                 //返回错误信息,并将异常记入TYStudio_Logging数据库。
  100.                 ViewData["ErrorMessage"] = _tyExceptionService.HandleException(ex, parms, ex.Message);
  101.                 return View(_supplierService.GetByID(id));
  102.             }
  103.         }
  104.     }
  105. }

Create(SupplierViewModel vModel) Action

SupplierController中主要介绍的是这个方法,首先我们定义一个规则,一个Action中只有一个return方便以后的维护。然后看一下我们的异常处理Try Catch。这里我们通过_tyExceptionService.HandleException这个方法进行异常的日志记录,这个方法的详细实现将在Exception异常处理文章中向大家说明。用ViewData["ErrorMessage"]传递HandleException方法返回的异常信息到View,当出现异常的时候页面就会看到相应的信息了。

UI的显示层View

这一层如果用到强类型View,我们不适用Entity而是DTO工程中的ViewModel,主要是把UI层和Model层分开,降低耦合度。

ViewData["ErrorMessage"]这个错误信息,你可以在页面上找一个合适的位置显示出来就ok了,通常我们把它放到master母版页中。

Controller中的权限管理

这个问题对于mvc4你可以参考天屹的MVC4 SimpleMembership权限管理系统的实现,加到里面就可以了。

总结:

BaseController的添加使得我们可以把公共的Service都管理起来一起注入。减少了单独Controller中的代码维护。Exception在Controller中捕获,同样更加利于系统的维护。

下一篇我们介绍StructMap的配置,与如何把Service注入到Controller,Repository注入到Service中的具体实现。

 



发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>