0

Для фона у меня есть слой данных и слой обслуживания на основе модели Rob Conery's Storefront и как у Роба, многие из моих объектов домена и связаны с LazyList<> и LazyItem<>, чтобы использовать отложенное выполнение Linq2Sql, учитывая, что мой Lazy* используются IQueryable<T>, а не this awesome delegate approach.Как я должен генерировать миниатюру?

Так я есть граф объекта, как это (в основном, каждая активность должна иметь галерею фотографий многих images- миниатюр и фотографии в натуральную величину):

latest3Activities[0].Gallery.Images.Inner[1].FullImage 

Тип Gallery имеет изображения свойство LazyList<PhotoGalleryImage> и поэтому IList<PhotoGalleryImage> из этого LazyList - это Inner, который вы видите. Каждый PhotoGalleryImage объект имеет FullImage и Thumbnail Недвижимость, оба типа Image.

Идея состоит в том, что полная загруженная фотография сохраняется в собственности PhotoGalleryImage.FullImage и изначально Thumbnail - Null. То, что я за этим: когда свойство Thumbnail доступно для доступа в первый раз, если это Null, я хочу, чтобы мой сервисный слой создавал Thumb, сохраняйте его в БД, затем возвращайте экземпляр Image, который является меньшим фото , У меня есть весь код для создания миниатюры из полноразмерного изображения, так что здесь не вопрос.

Что я не могу понять, как поймать первый доступ к свойству Thumbnail (в моем контексте архитектуры IQueryable<>), а затем на уровне обслуживания изменить размер, а не в репозитории (DAL). Я сильно чувствую, что уровень сервиса (бизнес) должен отвечать за это функциональное решение, но я не вижу, как заставить его работать.

В настоящее время я думаю, что сопоставление от моих классов домена в хранилищах к классам Linq2Sql было бы хорошим местом для идентификации этого «первого доступа», к которому я обращаюсь, но я не вижу тогда, как может быть вызван более низкий уровень до уровня обслуживания и выполнить сжатие (или даже если оно может, то оно должно).

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

Помощь Pls. Все отзывы приветствуются.

+0

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

+0

ok- в подробном представлении для Activity, я загружу в превью для связанной галереи фотографий через ajax (вроде того, как это делает Facebook). каждый элемент изображения галереи предоставляет мне доступ как к миниатюре (для таблицы изображений), так и к полноразмерному (когда пользователь нажимает на большой палец). –

ответ

2

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

В вашем случае это не имеет смысла: как только изображение будет загружено, серверу понадобится миниатюра - пользователь хочет увидеть новое изображение сразу, не так ли? Поэтому откладывание создания эскиза не имеет положительного ROI.

+0

Согласовано. Это тип концептуального ответа, который я получил после. –

+1

Действительно - для всех это недостатки, это одна из вещей, которые, по моему мнению, подходят для Personal Site Starter - если вы сохраняете изображение и различные миниатюры в базе данных, затем генерируйте миниатюру при ее загрузке/сначала сохраните ее , –

0

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

+0

Подробнее пожалуйста. Я не понимаю, как URI принесет мне пользу. Мне понадобится экземпляр Image, возвращенный из свойства Thumbnail. Я бы ожидал, что единственная разница в вызове свойства Thumbnail и получение изображения из БД для вызова свойства Thumbnail и использование «lazy-gen» будет включать в себя несколько сотен миллисекунд блокировки, в то время как оно разлагается и сохраняется для в первый раз. –

2

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

В конце концов я создал все миниатюры в точке, где изображение загружается через вызовы на уровень обслуживания с контроллера пользовательского интерфейса. Я попытался создать изображения на уровне домена до этого. Для этого я использовал шаблон, в котором, когда слой домена, необходимый для создания изображения, он поднимал событие, которое было подключено к служебному слою.Затем сервисный уровень передал экземпляр интерфейса хранилища обратно через аргументы событий на уровень домена, чтобы слой домена мог сохранять изображение. Это было очень слабо основано на некоторых идеях на Udi Dahan's blog, которые я натолкнулся на использование событий в модели домена в качестве способа использования логики в уровне обслуживания. К сожалению, я не могу найти ссылку на сайт Udi, но она где-то там. В любом случае он никогда не чувствовал себя правильно - он казался плотной связью по другому маршруту, поэтому я вернулся к созданию эскизов, созданных на момент загрузки изображения через служебный уровень. Однако, возможно, в вашем случае вы могли бы использовать идею событий из уровня домена для вызова логики на уровне сервиса. Я уверен, что в самой идее есть большая ценность, она просто не подходит для того, что я делаю.

+0

Забавный. Я рассматривал события, чтобы подключить два слоя как «план Б». Но я чувствую, что ты «никогда не чувствовал себя правильно». Это также похоже на множество беспорядков. Я предполагаю, что в первый раз, когда эти изображения будут доступны, будет, когда загрузчик получит сообщение от успешной загрузки - так что не важно, есть ли у меня большие пальцы на создании или ленивы - результат тот же. –

Смежные вопросы