2011-04-05 20 views
0

Hy guys。Leaner控制器

我是新的MVC和我有一個「胖」控制器,我不知道如何適應它。

這是一個控制器,我創建一個新的存儲庫,然後一個ViewModel獲得回購值+的isReaded財產

 public ActionResult Index() 
    { 
     try 
     { 

      NHibernateHelper helper = new NHibernateHelper(); 
      UnitOfWork unitOfWork = new UnitOfWork(helper.SessionFactory); 
      Repository<Order> orderRepo = new Repository<Order>(unitOfWork.Session); 
      IEnumerable<Order> orders = orderRepo.All(); 

       var viewModel = orders.Select(order=> new OrderViewModel 
       { 
        Order = order, 
        isReaded = order.Interactions.Any(x => x.Readed == true), 
       }); 

       return View(viewModel); 


     } 
     catch 
     { 
      return RedirectToAction("foo"); 
     } 
    } 

能有人給我一個提示,以適應它?

韓國社交協會!

回答

2

使用依賴注入並重構這些行來在控制器的構造函數中分配private readonly字段。

 NHibernateHelper helper = new NHibernateHelper(); 
     UnitOfWork unitOfWork = new UnitOfWork(helper.SessionFactory); 
     Repository<Order> orderRepo = new Repository<Order>(unitOfWork.Session); 

然後,將try-catch語句重構爲異常處理操作過濾器。有關這方面的教程和代碼,請參見http://www.squaredroot.com/2008/04/02/mvc-error-handler-filter/

然後,您的控制器操作即可完成。

[RedirectToActionOnError(Action = "foo")] 
    public ActionResult Index() 
    { 
     var viewModel = _orderRepo.All() 
      .Select(order=> new OrderViewModel 
      { 
       Order = order, 
       isReaded = order.Interactions.Any(x => x.Readed), 
      }); 
     return View(viewModel); 
} 

作爲一個側面說明,你再也不用寫if(someBooleanValue == true),你可以只寫if(someBooleanValue)

+1

這個鏈接也將幫助您完成實施錯誤處理過濾器:http://msdn.microsoft.com /en-us/library/dd410203(v=VS.90).aspx – smartcaveman 2011-04-05 13:50:22

0

將數據分配給您的視圖始終是控制器的責任;那就是說,你似乎可以將你的邏輯抽象成一個類來處理使用你的存儲庫並返回一個簡單的對象,它具有你需要的細節。

var myModelData = _someOtherObject.GetSelectedOrder(); 

var viewModel = new OrderViewModel 
{ 
    Order = myModelData.Order, 
    isReaded = myModelData.IsRead 
}; 

return View(viewModel); 

爲了您的例外情況,你應該定義一個ErrorFilterAttribute並將其應用到你的操作方法,如果你只想有你的_someOtherObject方法拋出異常。