かなり一般的なアーキテクチャがあります。
データベース
リポジトリ層
ビジネス オブジェクト
サービス層 - クライアントに DTO を提供します
Web レイヤー (MVC)
リソース、特に画像やポッドキャスト (例: http://media.mysite.com/podcasts/ ) への一般的なパスがいくつかあります。プロパティを持つ静的ユーティリティ クラスを作成したい:
MySite.Utils.ImagePathUri
MySite.Utils.PodcastsPathUri
等
私の質問は: uri パスをどこに置くのですか? このユーティリティ クラスはどのプロジェクトに入りますか?
当初、それは簡単なことのように思えました: Web レイヤーです。それはウェブサイトです。他のレイヤーに知られることなく、サイトの URL を変更できるはずです。
すべて順調でしたが、. . . そしてある日、私のサービスの 1 つが SyndicationFeed タイプを提供する必要がありました。SyndicationFeed には、部分的なファイル名だけでなく、完全な URI が必要です。ただし、サービスは完全なパスにアクセスできません。それとも彼らはすべきですか?
私はいくつかのことを自分自身と議論しましたが、確固たる立場を思い付くことができません:
- パスをサービス層に移動します。これにより、Web レイヤーがサービス レイヤーに緊密に結合されますが、最初から非常に緊密に結合されているため、おそらく問題ありません。
- パスをビジネス オブジェクトまたはリポジトリに移動します。私はこれが好きではありませんが、サービス層に入れることに前向きであれば、少なくともそれを検討する必要があります。
- SyndicationFeed をサービス レイヤー内で使用しないでください。Web レイヤーでのみ使用してください。問題は解決しましたが、SyndicationFeed はサービス レイヤーに属する必要があるようです。
- SyndicationFeed を破棄します。SyndicationFeed は、適切な XML を生成する PartialView を使用して MVC でより簡単に作成できます。ElementExtensions のような肥大化した抽象化をいじる必要はありません。私はこれが好きですが、多くの場所で SyndicationFeed を使用しているため、最も説明が必要な場所です。
- サービス レイヤーのシンジケーション フィードに偽の URI を提供し、それを Web レイヤーで変更します。ハックと言えますか?
- データベースにフル パスを入力します。最初は問題ないように思えますが、動的に生成された画像を取得するとすぐに壊れることに気付きます。
- 私には起こらない他の解決策。
あなたの考えは何ですか?Web リソース (画像、ポッドキャストなど) のユーティリティ クラスはどこに配置しますか? また、「Web レイヤー」と言う場合、SyndicationFeed の問題についてどう思いますか?
アップデート
結局、私は SyndicationFeed クラスを破棄することにしました。これにより、サービスおよびリポジトリ レイヤーにファイルへのパスを含める必要がなくなりました。ただし、問題は別の場所でも発生し、DI の使用、特に Ninject のような IoC は完全に理にかなっています。これらを共通のインターフェイスにまとめることも同様です。
SyndicationFeed、View エンジン、および Declarative が Declarative の方が優れている理由
私は SyndicationFeed を捨て、代わりに Razor を使用して必要な XML を作成しました。作成がはるかに簡単であるだけでなく、1000% 読みやすくなっています。私は、命令型コード (C#、VB など) を使用して XML を作成するのは、必要以上に難しいという意見に行き着きました。XML は宣言型であり、命令型ではありません。
代わりに、ビュー エンジン (Razor など) の宣言型構文は、命令型言語よりもはるかに扱いやすいと判断しました。