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

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

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

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

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

UserService.SaveEvidenceFiles(MyUser user, HttpFileCollectionBase files);

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам