バックグラウンド
私たちのサイトには、次のような形式のリンクがいくつかあります。
http://oursite.com/books/c_sharp_in_depth_12345 .
これを処理するために、次の単純なプロパティを使用しますUrl
。
public class Book
{
public string Url { get; set;}
}
基本的に、URL は、当社の Web サイトのドメイン、サイトのセクション (書籍など)、ページの名前、およびリソースを識別する一意の ID から取得されます。完全な URL がデータベースに保存されています。
データベースがセクション名を保存しているという事実は気に入りません。これは Web レイヤー プロパティのプロパティであり、本のプロパティではありません。データベースは、Web レイヤーに依存するべきではありません。
したがって、URL からセクションを削除すると、次のようになります。
public class Book
{
public string UrlWithoutSection { get; set;}
}
OK、これはこの URL で機能します。しかし、当社の SEO 担当者は、私たちの URL が間違っていて、私たちの唯一無二の愛である Google が私たちを愛してくれるのは、私たちが次のように URL を書き直した場合だけだと言います。
http://oursite.com/programming-books/c-sharp-in-depth-12345
おっと、Web レイヤーへのデータベースの依存関係を削除したと思っていましたが、そうではありませんでした。結局のところ、セクションへの依存関係は削除されましたが、URL の形式はデータベースにまだ存在しています。URL をオブジェクトに抽象化することでこれを修正します。
public class OurUrl
{
public string title { get; set; }
public string id { get; set; }
}
これで、Web レイヤーへの依存がなくなりました。ええと、今度は弊社の CEO が来ます。新しい会社を買収したばかりで、現在は雑誌を販売しています。すごい?雑誌の URL は次のようになります。
http://oursite.com/magazines/computers/stack-overflow-the-magazine/2012/01/01/12345
OK、問題ありません。別のオブジェクトを作成してください。
public class OurMagazineUrl : OurUrl
{
public DateTime PublishedDate { get; set; }
// Magazine enum will have to be created.
public MagazineType Type { get; set; }
}
それは機能しますが、大きなサイトの計画があることに気づき始めます。たくさんの URL。さまざまな形式の URL がたくさんあります。毎回新しいクラスを作成することは、大きな頭痛の種のようです。
問題の概要
Web 層がビジネス層とデータ層から適切に分離されるように、URL をどのように処理しますか? 私は解決策についていくつかの考えを思いつきました:
問題の詳細
これがいくつかの混乱を明確にするのに役立つことを願っています。
ASP.Net MVC を使用しています。ルートを使用します。ヘルパーを使用します。ビジネス オブジェクトではなく、フラット化された DTO を Web レイヤーに渡します。この問題は、サービス層と DTO の急増に関係しています。
これは主にトラフィックの多いニュース サイトであり、ビジネス サイトではありません。多くの異なる URL を持つことができ、URL はいつでも変更できます。それらは複雑で、管理者によって任意に決定される可能性があります。
URL の例 (実際のものではありません。例として作成されています)。
1. http://oursite.com/news/wi/politics/supreme-court/recent-ruling-someid
2. http://oursite.com/news/wi/politics/election-2012/candidate-x-takes-stand-on-issue-y-someid
3. http://oursite/com/news/politics/mayor-says-things-are-a-ok-someid
4. http://oursite.com/news/milwaukee/local-bar-named-to-HOF-someid
5. http://oursite.com/news/wi/politics/supreme-court-someid
6. http://oursite.com/news/whatever-cat-our-CEO-wants/subcat1/subcat2/etc/2011/10/31/some-story-someid
上記はすべて「記事」であり、記事クラスがあります。記事には、AuthorObject、RelatedLinksCollection などの多数のナビゲーション プロパティがあります。ビジネス オブジェクトはクライアントに渡すには重すぎるため、情報を平坦化する DTO を渡します (AuthorName など)。ただし、上記のリンクは、すべて「記事」であっても、異なる情報を必要とする場合があります。
- カテゴリ、サブカテゴリ、タイトル、ID が必要
- Category、Subcategory、PoliticsCategory、タイトル、ID が必要
- カテゴリ、タイトル、ID が必要
- カテゴリ、タイトル、ID が必要
- カテゴリ、サブカテゴリ、タイトル、ID が必要
- CeoCategory、CeoSubcategory、PublishedDate、Title、ID が必要
C# などの静的プログラミング言語では、これを処理する通常の方法は、別個の DTO クラスを作成することです。継承を追加してコードの一部を削減することもできますが、それでも複数の「アーティクル」dto クラスが作成されます。
public class IArticleDto {
public string title { get; set; }
public string body { get; set; }
public string Category { get; set; }}
public class StateArticleDto: IArticleDto {
public string title { get; set; }
public string body { get; set; }
public string Category { get; set; }}
public string StateCode { get; set; }
public string Subcategory { get; set; }
}
public class SupremeCourtArticleDto: IArticleDto {
public string title { get; set; }
public string body { get; set; }
public string Category { get; set; }}
public string Subcategory { get; set; }
}
public class ArbitraryCeoArticleDto: IArticleDto {
//who knows
}
等
交渉不可能な方法でカスタム URL を作成する機能。記事が何か (状態、カテゴリなど) に関連している場合、それは URL の一部になる可能性があります。
ソリューション?
Url
必要に応じてオブジェクトを追加し続けます。幾つか?少なくとも十数個ですが、名前を付けるのは面倒です。ビジネス オブジェクトごとに 1 つ実行すると、名前の問題は解決しますが、それは数十または数百の新しいオブジェクトを意味します。うん。IOC - 構成を介してルート パターンをデータ アクセス層に渡します。その後、データ アクセス レイヤーは完全な URL を作成できます。URL パターン名はまだ問題です。
Dictionary<TKey, TValue>
、などを使用KeyValuePair<TKey, TValue>
して引き込みます。URL の詳細には
Expando
またはを使用します。DynamicObject
したがって、url にはいくつかの基本的なプロパティ (name
とid
) が含まれますが、必要に応じて他のプロパティを追加できます。
動的プログラミングが静的言語よりも優れていると思われるため、4) を使用することを考えています。ただし、私は新しいおもちゃで遊ぶのが好きなので、それを最も見ているだけかもしれません (私はこれまでに expando を使用したことがありません)。
オブジェクトの爆発のため、1)よりも優れています。2) が複雑なシナリオで機能するかどうかはわかりません。DI を使用して単純なルート名 + ルート情報をデータ層に渡すこともできますが、追加のゲインなしで達成するのは難しいようです。また、複雑なルートではおそらく機能しないでしょう。そのためには、UI 側にルール エンジンが必要だと思います。
3)に比べて、4)の方が少し良いと思います。私が間違っている場合は誰かが私を修正しますが、動的型は辞書の上にあるシンタックスシュガーにすぎないように見えますが、よりクリーンなコードという利点があります。ちょっとした考え。