Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 2 正在将HttpFileCollectionBase传递到业务层-错误?_Asp.net Mvc 2_Business Logic - Fatal编程技术网

Asp.net mvc 2 正在将HttpFileCollectionBase传递到业务层-错误?

Asp.net mvc 2 正在将HttpFileCollectionBase传递到业务层-错误?,asp.net-mvc-2,business-logic,Asp.net Mvc 2,Business Logic,希望有一个简单的解决办法 我有我的MVC2项目,它允许上传某些表单上的文件。我正在努力保持我的控制器精简,并在业务层处理这类事情 也就是说,HttpFileCollectionBase显然在System.Web程序集中 理想情况下,我想打电话给: UserService.SaveEvidenceFiles(MyUser user, HttpFileCollectionBase files); 或者类似的东西,让我的业务层处理如何以及在哪里保存这些东西的逻辑 但是,在关注点分离等方面,让我的模型

希望有一个简单的解决办法

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

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

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

UserService.SaveEvidenceFiles(MyUser user, HttpFileCollectionBase files);
或者类似的东西,让我的业务层处理如何以及在哪里保存这些东西的逻辑

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

因此,我们(我知道)有几个选择:

  • web项目处理这个,我的控制器变得越来越胖
  • 将HttpFileCollectionBase映射到我的业务层喜欢的东西
  • 传递集合,并接受我从业务项目中引用System.Web

  • 我很想在这里得到一些关于这类事情的最佳实践方法的反馈,即使不是特别在上面的上下文中。

    如果你想不让控制器知道逻辑,我只想使用自定义模型绑定器,然后你可以将提取的数据粘贴到模型中,你可以用它做你想做的事情

    <强>澄清< /强> -我认为模型绑定器和其他拦截技术是一种方便的方法,将逻辑从控制器中分离出来并进入可独立维护的容器——这是基础设施代码/ Web逻辑,因此不属于业务逻辑,因此可以很好地引用系统.Web等。


    澄清-实际上,这是你的变相选项2,你使用模型绑定器将不友好的数据映射到其他代码可以识别的东西,但这样做不会影响干净的控制器。

    假设无法轻松模拟HttpFileCollectionBase,您可以传入类似Dictionary的内容,其中MyFile包装HttpPostedFile。如果HttpFileCollectionBase可以很容易地用于单元测试,我看不出有什么意义

    +1个好问题,我也从来没有想过。为了记录在案,我选择了选项3,但我对其他答复和理由感兴趣。想知道你为什么建议使用Galilyou?我不知道选项4-模型活页夹可用时为什么选择3?=)(实际上这是diguise中的选项2)使用
    HttpPostedFile
    仍然意味着业务层依赖于
    System.Web
    不是吗?您是指MyFile“包装”HttpPostedFile还是“映射”?我可以看到我的web层将如何轻松地“映射”到“a.n.other”格式,然后我的前端是否是web/桌面/其他东西也无所谓,只要他们知道如何映射到该底层格式。如果是包装,那么oedo是对的,你仍然需要业务层项目中的System.Web——我想我的问题是‘有那么糟糕吗?’——从纯粹的建模角度来看,感觉是这样的,但是……?嘿,Rob:)可能不清楚——所有的绑定都很好,这是我在需要将集合下放到单独的业务层项目时所做的。那里的示例仍然使用HttpPostedFileBase(System.Web),因此如果我选择在业务层项目中处理该问题,我的业务层仍然需要一个ref?如果使用自定义模型绑定器,则您的控制器永远不会获得HttpPostedFileBase,这意味着您永远不会将任何内容从System.Web传递到您的业务逻辑中,这意味着你不需要担心推荐人。Modelbinders=Web逻辑,而不是业务逻辑本质上这意味着你保持你的控制器精简,这有助于测试和维护,你将一些可怕的映射逻辑委托给一个模型绑定器,而你的其余代码就好像模型绑定器根本不存在一样。啊,太棒了,Rob-yup,这帮了大忙-干杯。现在阅读更多关于ModelBinder的内容!英雄联盟