Дизайн приложения: создание и сохранение миниатюр изображений в приложении XAF/XPO
Я разрабатываю приложение с XPO/ XAF, и мне нужно управлять фотографиями вместе с некоторой дополнительной информацией.
Это упрощенный (псевдо) код, который я использую для своей сущности Photo:
public class Photo
{
public Photo()
{
CreationDate = DateTime.UtcNow;
}
private Image imageData;
public Image Data
{
get { return imageData; }
set
{
imageData = value;
// Current Impl: Use static code to create thumbnail
Thumbnail = ImageService.CreateThumbnail(value);
}
}
public Image Thumbnail { get; private set; }
public Guid Id { get; }
public DateTime CreationDate { get; private set; }
public string Description { get; set; }
}
Объект Photo используется в различных других объектах, например
public class Inspection
{
public Photo Photo { get; set; }
}
public class User
{
public Photo Photo { get; set; }
}
Всякий раз, когда данные фотографии изменяются, миниатюра также должна быть обновлена. Мое опубликованное решение работает, но довольно уродливо, не так ли?
И также невозможно реализовать новое требование: должна быть возможность указать (для всего приложения) качество миниатюр в зависимости от использования (например, более высокое качество для миниатюр инспекции, более низкое качество для миниатюр пользователей).
В XAF я бы реализовал это требование с помощью ViewController ViewController, реагирующего на изменения фотографии (с учетом текущего "собственного вида"). Но у этого решения есть некоторые недостатки:
1) Установщик свойств эскизов не может быть более приватным.
2) Тестировать (модульно) довольно сложно, потому что для настройки инфраструктуры ViewController требуется дополнительный код.
3) ViewController активен, только если есть представление. Но также возможно редактировать фотографии из пользовательского OData-Service. Конечно, я могу / должен переместить код ImageProcessing из ViewController в служебный класс / метод, но я должен помнить, чтобы вызывать этот код при использовании моих контроллеров OData.
4) При просмотре / редактировании фотографий из общего списка просмотра ViewController не знает, какой параметр качества использовать (потому что сейчас существует только общий класс Photo и обратной ссылки на "владельца" не существует). Конечно, можно наследовать различные классы фотографий (UserPhoto/InspectionPhoto/...), но имеет ли это смысл?
Я думаю, что создание и сохранение миниатюр - довольно распространенная задача, поэтому мне действительно интересны ваши идеи. Мне также нравятся концепции / идеи модели DDD/rich-domain, поэтому я хотел бы знать, возможно ли принять такие концепции в моей ситуации
1 ответ
Вы задаете довольно субъективные вопросы о дизайне, и нет "правильного" ответа, но вот некоторые мысли.
Это Thumbnail
свойство, необходимое в бизнес-объекте, поскольку оно используется только во время просмотра? Потянув логику в ViewController
имеет смысл.
Это довольно легко для модульного тестирования XAF Controllers
и есть несколько примеров в центре поддержки DevExpress и документации ( S32594, Как проверить действие). Также у фреймворка eXpand есть хороший пример кода для настройки тестов фреймворка XAF.
Другой вариант - реализовать собственный редактор для миниатюры. Вы даже можете динамически добавить его в макет без постоянного свойства в бизнес-объекте. На этой странице много вариантов реализации пользовательских ViewItems.
Еще один подход заключается в изменении макета во время выполнения для добавления непостоянного эскиза. В документации приведен пример, который добавляет непостоянный элемент управления изображением в подробный вид.
Вы также можете быть заинтересованы в выпуске этого центра поддержки Q512788.