用于ASP.NET MVCfile upload的Skinny控制器

我逐渐将一个经典的ASP网站转换为ASP.Net MVC。 在我的模型文件夹中,我已经进一步将其细分为业务对象(BO),业务逻辑(BLL)和数据访问层(DAL),基本上是模型中的三层架构。 这似乎迄今在数据库操作方面运行良好,并且保持我的控制器不变。 例如,一个典型的控制器看起来像这样:

public ActionResult Index() { UserName UserDetails = UserManager.GetUserName(); CarrierList CarrierList = CarrierManager.GetCarrierList(); return View(new CarrierViewModel(CarrierList, UserDetails)); } 

基本上我只是使用控制器来传递一个函数到BLL层,然后与DAL和BO层进行交互。

我感到困惑的地方是与非数据库操作相关的逻辑(如file upload)的正确位置。 例如,我正在编写代码来上传Excel文件并将其内容导入到数据库表中。 如果我遵循上面相同的模式,我的控制器应该只包含一个函数,将file upload请求传递给BLL层,如下所示:

 [HttpPost] public ActionResult Index(HttpPostedFileBase file) { FileManager.ImportExcel(file); return RedirectToAction("Index"); } 

问题是,我看到的每个教程或示例file upload和Excel操作将他们的文件和Excel代码直接在控制器中。 例如这里 。 即使Scott Hanselman 在这里的post似乎暗示,在控制器中放置file upload逻辑是可以的。

我的问题是,鉴于我的三层ASP.NET MVC架构和胖模型/瘦身控制器devise的目标,我是否正确地将上传和Excel操作逻辑卸载到模型中的BLL上? 这似乎与我正在尝试做的一致,但是因为我在网上看到的所有例子只是将文件操作逻辑放在控制器中,所以我觉得我正在对付谷物。

你应该只是获得stream并将stream传递给BLL。 这样你的BLL不依赖于HttpPostedFileBase,而只是在一个Stream上。

无论如何,看起来,你的BLL代码是在你的MVC应用程序中,这不是一个好主意。 你应该为BLL创build一个类库,一个用于BO,一个用于DAL,并且如果可能的话,将它们松散地连接起来。