背景として、 Rob Conery の Storefrontモデルに大まかに基づいたデータ レイヤーとサービス レイヤーがあり、Rob のように、私のドメイン オブジェクトの多くは と でチェーンされておりLazyList<>
、LazyItem<>
Linq2Sql が提供する遅延実行をLazy*
利用しています。この素晴らしいデリゲート アプローチIQueryable<T>
ではなく。
だから私はこのようなオブジェクトグラフを持っています(基本的に、各アクティビティには多くの画像のフォトギャラリーが必要です-サムネイルとフルサイズの写真):
latest3Activities[0].Gallery.Images.Inner[1].FullImage
型にはGallery
Images プロパティがあるLazyList<PhotoGalleryImage>
ため、IList<PhotoGalleryImage>
その LazyList が表示されInner
ます。各PhotoGalleryImage
アイテムには、FullImage
プロパティとThumbnail
プロパティがあり、両方ともタイプがImage
です。
rez でアップロードされた完全な写真がPhotoGalleryImage.FullImage
プロパティに保存され、最初はThumbnail
プロパティがNull
. 私が求めているのは次のとおりです。Thumbnail
プロパティに初めてアクセスしたときにNull
、サービス レイヤーで Thumb を生成し、それを DB に永続化してから、Image
小さい写真であるインスタンスを返します。フルサイズの画像からサムネイルを作成するためのすべてのコードがあるので、ここでは問題にしません。
私が理解できないのは、Thumbnail
(私のアーキテクチャコンテキストで) プロパティの最初のアクセスをキャッチしIQueryable<>
、リポジトリ (DAL) ではなくサービス層にサイズ変更をさせる方法です。サービス (ビジネス) レイヤーがこの機能の決定に責任を負うべきだと強く感じていますが、それを機能させる方法がわかりません。
現在、リポジトリ内のドメイン クラスから Linq2Sql クラスへのマッピングは、私が参照するこの「最初のアクセス」を識別するのに適した場所になると考えていますが、下位層がサービスを呼び出す方法がわかりません。レイヤーを作成してシュリンクを実行します (または、シュリンクが可能である場合でも、シュリンクを実行する必要があります)。
たぶん、私の設計により、Repos に変換を行わせるように制限されているのでしょう。たぶん、サービス層にこのロジックをまったく実行させたくないはずです。たぶん、私のデザインは本当に恐ろしいので、この混乱に直面するべきではありません.
助けてください。すべてのフィードバックをお待ちしております。