将HttpFileCollectionBase传递给业务层 - 不好吗?

时间:2010-05-25 08:31:41

标签: asp.net-mvc-2 business-logic

希望有一个简单的解决方案。

我有我的MVC2项目,允许上传某些表格上的文件。我正在努力保持我的控制器精益,并在业务层中处理这类事情的处理。

那就是说,HttpFileCollectionBase显然是在System.Web程序集中。

理想情况下,我想打电话给:

UserService.SaveEvidenceFiles(MyUser user, HttpFileCollectionBase files);

或类似的东西,让我的业务层处理这些东西保存方式和位置的逻辑。

但是,在关注点分离等方面让我的模型层引用System.Web感觉有点蠢。

所以,我们(我知道)有几个选择:

  1. 处理此问题的网络项目,以及我的控制器越来越胖
  2. 将HttpFileCollectionBase映射到我的业务层喜欢的内容
  3. 传递集合,并接受我从我的业务项目中引用System.Web
  4. 在这里,我们会喜欢一些关于此类事情的最佳实践方法的反馈 - 即使不是特别针对上述情况。

2 个答案:

答案 0 :(得分:2)

如果您想要将逻辑从控制器中移除,我会使用自定义模型绑定器 - 然后您可以将提取的数据粘贴到您可以按照自己的意愿执行的模型中。

http://www.heartysoft.com/post/2010/05/06/ASPNET-MVC-ModelBinding-Multiple-File-Uploads-to-an-Array.aspx

澄清 - 我认为模型绑定器和其他拦截技术是将逻辑从控制器拆分到可单独维护的容器中的便捷方式 - 这是基础结构代码/ Web逻辑,因此不属于业务逻辑因此可以愉快地引用System.Web等。

澄清 - 实际上这是伪装的选项2,您使用模型绑定器将不友好的数据映射到其他代码可以识别的内容,但是您这样做的方式不会妥协你的清洁控制器。

答案 1 :(得分:0)

假设您无法轻松模拟HttpFileCollectionBase,您可以传入类似Dictionary< String,MyFile>的内容。 MyFile包装HttpPostedFile的地方。如果HttpFileCollectionBase很容易被单元测试模拟,我认为没有意义。