事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象Review就产生了,我们要设计一个视图,它来实现对三个对象的评论功能,没有人会希望同样的功能被重复的开发,相同的代码出现的不同的地方,这当然也违背了DRY原则,所以,我们需要抽象,我们需要封装,我们需要对问题进行面向对象的分析. 第一部:将对象抽象出来,找来不变的与变化的属性 product,user,order共同作用于reviews,我们来看一下review的实体结构
1 ///2 /// 评论对象 3 /// 4 public class Review 5 { 6 public long ID { get; set; } 7 ///8 /// 被评论对象的类型 9 /// 10 public int ObjType { get; set; }11 ///12 /// 被评论对象的ID13 /// 14 public long ObjID { get; set; }15 [Required]16 public string Title { get; set; }17 [Required]18 public string Content { get; set; }19 [Required]20 public DateTime CreateDate { get; set; }21 }
1 ///2 /// 系统主要对象的类型3 /// 4 public enum ObjectType5 {6 User,7 Product,8 Order9 }
而事实上,除了ObjType与ObjID之外,其它属性对于三大对象来说都是相同的,这时,我们可给在设计视图时,将objtype与objid以参数的形式告诉review,代码如下:
1 ///2 /// 评论公用视图 3 /// 4 ///5 public ActionResult Review(int? objID, int? objType) 6 { 7 return View(new Review 8 { 9 ObjID = objID ?? 0,10 ObjType = objType ?? 1,11 Content = "",12 Title = "",13 });14 }
最后通过提交表单将objid和objtype的值post到实体中,然后根据objtype来确实操作完成后页面所重定向的地址. 代码如下:
1 [HttpPost] 2 public ActionResult Review(Review entity) 3 { 4 if (ModelState.IsValid) 5 { 6 //数据操作逻辑 7 //code... 8 switch (entity.ObjType) 9 {10 case (int)ObjectType.User:11 return RedirectToAction("Index", "User", new { id = entity.ObjID });12 case (int)ObjectType.Product:13 return RedirectToAction("Index", "Product", new { id = entity.ObjID });14 case (int)ObjectType.Order:15 return RedirectToAction("Index", "Order", new { id = entity.ObjID });16 default:17 break;18 }19 }20 else21 ModelState.AddModelError("", "请认真填写...");22 return View();23 }
View的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.