0

Für Hintergrund, ich habe eine Datenschicht und Service-Schicht lose basierend auf Rob Conery's Storefront Modell und wie Rob, viele meiner Domain-Objekte und verkettet mit LazyList<> 's und LazyItem<>' s, um die verzögerte Ausführung, die Linq2Sql bietet, dass meine Lazy* Typen verwenden IQueryable<T> anstatt this awesome delegate approach.Wie soll ich ein Thumbnail-Bild erzeugen?

So habe ich ein Objekt Diagramm wie folgt aus (im Grunde sollte jede Aktivität eine Foto-Galerie von vielen Bilder- Thumbnails und Bildern in voller Größe):

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

Der Gallery Typ hat eine Eigenschaft Images von LazyList<PhotoGalleryImage> und so die IList<PhotoGalleryImage> von dieser LazyList ist die Inner Sie sehen. Jeder PhotoGalleryImage Artikel hat eine FullImage Eigenschaft und eine Thumbnail Eigenschaft, beide vom Typ Image.

Die Idee ist, dass das voll rez hochgeladen Foto in der PhotoGalleryImage.FullImage Eigenschaft gespeichert wird und zunächst die Thumbnail Eigenschaft ist Null. Was ich danach bin, ist dies: Wenn die Thumbnail Eigenschaft zum ersten Mal zugegriffen wird, wenn es Null ist, möchte ich meine Service-Schicht, um den Daumen zu generieren, bestehen Sie es in der DB, dann geben Sie die Image Instanz zurück, die das kleinere Foto ist . Ich habe den ganzen Code, um das Thumbnail aus dem Vollbild zu erstellen, also ist das hier nicht die Frage.

Was ich nicht herausfinden kann ist, wie man den ersten Zugriff der Thumbnail Eigenschaft (in meinem IQueryable<> Architektur Kontext) fangen und dann die Service-Schicht die Größenänderung und nicht die Repositories (DAL) tun. Ich bin der festen Überzeugung, dass die Service- (Business-) Schicht für diese Funktionalität verantwortlich sein sollte, aber ich sehe nicht, wie sie funktioniert.

Momentan denke ich, dass die Zuordnung von meinen Domain-Klassen in den Repositories zu den Linq2Sql-Klassen ein guter Ort wäre, um diesen 'ersten Zugriff' zu identifizieren, aber ich sehe dann nicht, wie eine niedrigere Ebene dann aufrufen kann in die Service-Schicht und führen Sie die Schrumpfung (oder sogar, wenn es kann, dass es sollte).

Vielleicht mein Design zwingt mich, die Repos die Konvertierung zu machen. Vielleicht sollte ich nicht wollen, dass die Service-Schicht diese Logik überhaupt ausführt. Vielleicht ist mein Design einfach so schrecklich, dass ich dieses Durcheinander überhaupt nicht sehen sollte.

Pls Hilfe. Alle Rückmeldungen werden geschätzt.

+0

Bitte erläutern Sie, wie Sie die thumbnailed Image-Instanz verwenden werden. –

+0

ok- in der Detailansicht für eine Aktivität lade ich die Thumbs für die dazugehörige Fotogalerie via Ajax ein (so wie Facebook das tut). Jedes Galerie-Bildelement gibt mir Zugriff auf das Miniaturbild (für die Tabelle der Bilder) und das Vollbild (für den Fall, dass ein Benutzer auf einen Daumen klickt). –

Antwort

2

Der Punkt von lazy init ist, die Zuweisung von Ressourcen zu verzögern, da Sie nicht wissen, wann oder wenn Sie sie benötigen.

In Ihrem Fall macht das nicht wirklich Sinn: Sobald das Bild hochgeladen wird, benötigt der Server das Thumbnail - der Benutzer möchte das neue Bild sofort sehen, richtig? Daher hat das Verzögern der Erstellung des Miniaturbilds keinen positiven ROI.

+0

Einverstanden. Dies ist die Art der konzeptionellen Antwort, die ich suchte. –

+1

In der Tat - Für all seine Fehler ist dies eines der Dinge, von denen ich denke, dass das Personal Site Starter Kit richtig funktioniert - wenn Sie das Bild und verschiedene Thumbnails in der Datenbank speichern, generieren Sie das Thumbnail beim Hochladen/Speichern Sie es zunächst . –

0

Ich gehe davon aus, dass Sie benötigen Bild URI, um ein Bild anzuzeigen, die von einem IThumbnailingService Ihnen übergeben werden können, die Thumbnail erzeugen, wenn eine gültige URI erforderlich und zurück, die auf das erzeugte Bild zeigt.

+0

Mehr Detail bitte. Ich verstehe nicht, wie ein URI mir gut tut. Ich benötige die Image-Instanz, die von der Thumbnail-Eigenschaft zurückgegeben wird. Ich würde erwarten, dass der einzige Unterschied zum Aufrufen der Thumbnail-Eigenschaft und dem Aufruf des Thumbnails von der DB, die Thumbnail-Eigenschaft aufzurufen und das "Lazy-Gen" aktiviert wird, einige hundert Millisekunden zu blockieren, während es geniert und beibehalten wird das 1. Mal. –

2

Ich hatte vor ein paar Monaten ein sehr ähnliches Problem mit hochgeladenen Bildern, Thumbnail-Generierung und der Frage, wo der Code zum Erzeugen der Thumbnail-Bilder gehen soll. Ich hatte auch wirklich das Gefühl, dass dieser Code in der Service-Schicht gehörte (nicht zuletzt, weil der Speicher für die Bilddateien und Thumbnails in eine Schnittstelle abstrahiert und über einen IOC-Container injiziert wurde und ich keine Abhängigkeitsinjektion in meine Domain haben wollte Schicht).

Am Ende habe ich alle Miniaturansichten an dem Punkt erstellt, an dem das Bild über Aufrufe der Serviceebene vom UI-Controller hochgeladen wird. Ich habe vorher versucht, die Bilder in der Domain-Ebene zu erstellen. Um dies zu tun, habe ich ein Muster verwendet, bei dem, wenn der Domänen-Layer zum Erzeugen eines Bildes benötigt wurde, ein Ereignis ausgelöst wurde, das an die Dienst-Ebene angeschlossen wurde.Die Serviceschicht übergab dann eine Instanz der Speicherschnittstelle über Ereignisargumente an die Domänenebene zurück, sodass die Domänenschicht das Abbild beibehalten konnte. Dies basierte sehr lose auf einigen Ideen zu Udi Dahan's blog, dass ich auf die Verwendung von Ereignissen in einem Domänenmodell stieß, um die Logik in der Serviceebene zu nutzen. Ich kann die Referenz auf Udi's Seite leider nicht finden, aber sie ist irgendwo da. Auf jeden Fall fühlte es sich nie wirklich richtig an - es schien eine enge Kopplung über eine andere Route zu sein, weshalb ich zu dem Zeitpunkt, als das Bild zum ersten Mal über die Service-Schicht hochgeladen wurde, die Vorschaubilder erstellt habe. In Ihrem Fall könnten Sie jedoch die Idee von Ereignissen aus dem Domänen-Layer verwenden, um Logik in der Service-Schicht aufzurufen. Ich bin mir sicher, dass die Idee selbst sehr viel Wert ist, sie passte einfach nicht zu dem, was ich tat.

+0

Lustig. Ich habe über Ereignisse nachgedacht, um die beiden Schichten als "Plan B" zu verbinden. Aber ich fühle dich mit dem "es hat sich nie wirklich richtig angefühlt". Es scheint auch viel Chaos zu sein. Ich denke, das erste Mal, wenn diese Bilder aufgerufen werden, ist es, wenn der Uploader den Post von einem erfolgreichen Upload zurückbekommt - also ist es egal, ob ich die Daumen anlege, oder faul - das Ergebnis ist das selbe. –

Verwandte Themen