Я разрабатываю приложение с помощью XPO/XAF, и мне нужно управлять фотографиями вместе с некоторой дополнительной информацией.
Это упрощенный (псевдо) код, который я использую для своей фотографии:
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 я бы реализовал это требование с помощью ViewControllerViewController, реагирующего на изменения фотографии (принимая текущий «владеющий вид» во внимание). Но у этого решения есть некоторые недостатки:
1) Установщик свойства эскиза больше не может быть приватным.
2) Это довольно сложно (модульное) тестирование, потому что для настройки инфраструктуры ViewController требуется дополнительный код.
3) ViewController активен только при наличии представления. Но также возможно редактировать фотографии из пользовательской службы OData. Конечно, я могу/должен переместить код ImageProcessing из ViewController в служебный класс/метод, но я должен не забывать вызывать этот код при использовании моих контроллеров OData.
4) При просмотре/редактировании фотографий из общего списка ViewController не знает, какую настройку качества использовать (поскольку прямо сейчас существует только общий класс Photo и не существует обратной ссылки на «владельца»). Конечно, можно наследовать различные классы Photo (UserPhoto/InspectionPhoto/...), но имеет ли это смысл?
Я думаю, что создание и сохранение эскизов — довольно распространенная задача, поэтому мне очень интересны ваши идеи. Мне также нравятся концепции/идеи модели DDD/rich-domain, поэтому я хотел бы знать, можно ли применить такие концепции к моей ситуации.