Передача HttpFileCollectionBase на бизнес-уровень - плохо?

надеюсь, есть простое решение для этого.

У меня есть проект MVC2, который позволяет загружать файлы в определенные формы. Я пытаюсь сохранить свои контроллеры компактными и обрабатывать такие вещи на уровне бизнеса.

Тем не менее, HttpFileCollectionBase, очевидно, находится в сборке System.Web.

В идеале я хочу позвонить примерно так:

UserService.SaveEvidenceFiles(MyUser user, HttpFileCollectionBase files);

или что-то подобное, и пусть мой бизнес-уровень обрабатывает логику того, как и где эти вещи сохраняются.

Но мне кажется немного неприятным, когда мой слой моделей ссылается на System.Web с точки зрения разделения проблем и т. Д.

Итак, у нас есть (насколько я знаю) несколько вариантов:

  1. веб-проект обрабатывает это, и мои контроллеры становятся толще
  2. сопоставление HttpFileCollectionBase тому, что нравится моему бизнес-уровню
  3. прохождение коллекции и принятие того, что я ссылаюсь на System.Web из моего бизнес-проекта

Хотел бы получить здесь отзывы о передовых подходах к такого рода вещам - даже если не в контексте вышеизложенного.


person Terry_Brown    schedule 25.05.2010    source источник
comment
+1 хороший вопрос, кое-что у меня тоже никогда не возникало. для протокола, я выбрал вариант 3, но меня интересуют другие ответы и рассуждения.   -  person chris    schedule 25.05.2010
comment
хотите знать, почему вы предложили этого некоего Галиля?   -  person Terry_Brown    schedule 25.05.2010
comment
Я не уверен, почему Вариант 3, когда доступен Вариант 4 - папки с моделями? =) (Фактически, это Вариант 2 в цифровой форме)   -  person Rob Ashton    schedule 25.05.2010


Ответы (2)


Я бы просто использовал настраиваемый связыватель модели, если вы хотите сохранить логику за пределами своих контроллеров - тогда вы можете вставить извлеченные данные в модель, с которой вы можете делать то, что хотите.

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

Уточнение. Я считаю, что привязки моделей и другие методы перехвата являются удобным способом разделения логики из контроллеров на отдельные обслуживаемые контейнеры - это код инфраструктуры / веб-логика и, следовательно, не входит в бизнес-логику. и, таким образом, можете с радостью ссылаться на System.Web и т. д.

Уточнение. По сути, это ваш замаскированный вариант 2, вы используете привязки моделей для сопоставления недружественных данных с тем, что может распознать остальная часть вашего кода, но вы делаете это таким образом, чтобы не подвергать риску ваши чистые контроллеры.

person Rob Ashton    schedule 25.05.2010
comment
Эй, Роб :), может быть, не совсем ясно - привязка всего этого в порядке, это то, что я делаю, когда мне нужно передать эту коллекцию в отдельный проект бизнес-уровня. В приведенном здесь примере по-прежнему используется HttpPostedFileBase (System.Web), поэтому моему бизнес-уровню все равно понадобится ссылка, если я решу обработать это в проекте бизнес-уровня? - person Terry_Brown; 25.05.2010
comment
Если вы используете настраиваемый связыватель модели, ваш контроллер никогда не получает HttpPostedFileBase, что означает, что вы никогда ничего не передаете из System.Web в свою бизнес-логику, что означает, что вам не нужно беспокоиться о ссылках. Modelbinders = веб-логика, а не бизнес-логика - person Rob Ashton; 25.05.2010
comment
По сути, это означает, что вы сохраняете свой контроллер компактным, что облегчает тестирование и ремонтопригодность, и вы делегируете некоторую ужасную логику сопоставления связывателю модели, а остальная часть вашего кода происходит так, как будто связывателя модели вообще не существует. - person Rob Ashton; 25.05.2010
comment
аааа, фантастический Роб - ага, это очень помогает - подбадривает человека. Теперь, чтобы узнать больше о модельных переплетах! ржу не могу - person Terry_Brown; 25.05.2010

предполагая, что вы не можете легко смоделировать HttpFileCollectionBase, вы можете передать что-то вроде Dictionary ‹String, MyFile›, где MyFile является оболочкой HttpPostedFile. если HttpFileCollectionBase можно легко смоделировать для модульных тестов, я не вижу смысла.

person benmmurphy    schedule 25.05.2010
comment
использование HttpPostedFile по-прежнему означает, что бизнес-уровень зависит от System.Web, не так ли? - person chris; 25.05.2010
comment
вы имели в виду MyFile "обертывают" HttpPostedFile или "карты"? Я могу видеть, как мой веб-слой будет удобно «сопоставляться» с форматом «a.n.other», и тогда не будет иметь значения, был ли мой внешний интерфейс веб / настольным компьютером / чем-то еще, если они знали, как сопоставить с этим базовым форматом. Если это упаковка, то oedo прав, вам все равно понадобится System.Web в проекте бизнес-уровня - я думаю, мой вопрос: «Это плохо?» - с чисто модельной точки зрения, кажется, но ....? - person Terry_Brown; 25.05.2010