1739135638
2025-02-09 20:47:00
Optimizely CMS Webサイトを構築する主な課題は、そのマルチサイト機能を前もって考えることです。事実の後に調整することは困難な作業になる可能性があり、多くの場合、多くのリファクタリングが必要です。
このブログ投稿では、C#ソリューションの下で、構造的に言えば、単一のWebサイトを簡単に分離する方法を見つけた方法について少し説明します。
もちろん、これはいくつかの変更を意味し、完璧とはほど遠いことを意味します。しかし、私はコミュニティに私の発見を共有することが大いに役立つと思いました。
ゴール
もちろん、将来の開発に簡単に対応できるものに対する解決策のアーキテクチャを構築することは、それが伴う前払いの努力とコストの価値があるかどうかを常に決定する問題です。クライアントがOptimizely CMSプロジェクトに1つ以上のサイトを確実に持っている場合は、ソリューションを前もって正しく構築するという問題は、開発の複雑さを減らすためにできる最善です。単一の場所でロット。
これは、クライアントが同じ傘の下で新しいサイトを作成するように私たちに要求していたときに、私たちが頻繁に出くわしたものです。既存のコードベースで何をし、新しいWebサイトコードベースを実装している間、回帰を避けますか?
さて、それに対する私の解決策は次のとおりです。オプティマイズリーCMSで構成されたサイト名に基づくルーティング。これにより、本質的に完全に分離されたC#ライブラリプロジェクトを作成し、その単一のCMSサイトのすべてのビジネスロジックをその単一のバケットに分離できます。
デプス内の詳細
明らかにあるだけではありません ルーティング そこに魔法がかかりますが、全体として、目標は、特定の要素がレンダリングされる場所と方法を駆動するASP.NETコアと最適化するCMSのすべてのコア要素を変更することでした。
Optimizelyコンテンツタイプ
デフォルトでは、コンテンツにコントローラーはありません。ページとブロック用のコントローラーを作成する必要があります。ブロック用のコントローラーを作成することを余儀なくされていません。これはオプションであり、 Optimizelyによって推奨されます。
部分的なビューの位置を変更するためだけにコントローラーを使用することを避けるには、ASP.NET Razorビューエンジンの調整が必要です。これは、を実装するクラスを作成することでパーソナライズできるものです IViewLocationExpander。その場所エクスパンダーは、私たちのためにいくつかのことをする必要があります。
まず、場所の注文が最も正確ではない場所にあることを確認します。ロジックではそのようになります:
- サイトの名前とコンテンツタイプの名前があるフォルダー内にあるビューを探してください。
- サイトの名前が付いたフォルダー内にあるビューを探してください。
- 現在レンダリングされているコンテンツタイプの名前が付いたフォルダー内にあるビューを探してください。
- 前の手順と同様ですが、「共有」フォルダー内。エキスパンダーは、サイトの「共有」の場所の中を見ることができます。
ちなみに、実装に関する詳細情報は後で共有されます。しかし、あなたはアイデアを得ます。これにより、基本的にビューエンジンに、要求されているサイトにのみ適用可能な場所を探すように依頼します。例を挙げると、このブログはそれを念頭に置いて設計されています。ビュー構造がどのように見えるかの視覚的な例は次のとおりです。
ご覧のとおり、すべてのビューはサイトの名前が付いたフォルダー内にあります。それらのどれもそれの外にありません。これは2つのことを意味します。
- サイト間で同じコンテンツタイプを共有したい場合は、完全に可能です。彼らはできます:
- 同じ共有ビューを使用します。
- 特定のサイトに特徴的なビューがあります。
- で作業します ハイブリッド モード。つまり、両方が一緒に作業することができることを意味します。
- 非常に具体的です
_ViewImportsそして_ViewStartサイトのファイル。
このアプローチを使用すると、行う必要がある唯一のことは、Optimizely CMSとVoilaの下で作成されるサイトの名前を持つフォルダーを作成することです。以前のスクリーンショットに表示されるプロジェクトには含まれていません Startup.cs。これは、開始アセンブリプロジェクトのみが持っているものです。これはここです のみ 残りから完全に分離されたC#ライブラリプロジェクト。
しかし、リクエストが作成されているサイトとコンテンツタイプのどのサイトとコンテンツの下でどのようにわかりますか?
これは良い質問です。短い答えは、ASP.NETコアルーティングエンジンで行うための変更に再び依存しています。
Optimizely CMSは、エンドポイントミドルウェアと呼ばれるものを使用します。これがあなたの下にある理由です Startup.cs ファイル、あなたはそれと同じようなことをする必要があります:
app.UseEndpoints(endpoints =>
{
endpoints.MapContent();
});
MapContent() 基本的に、MicrosoftのCMSルーティングシステム全体をフックする方法です。もちろん、これは単純化しすぎですが、写真が撮られます。エンドポイントミドルウェアが呼び出されると、マッチャーポリシーが呼び出され、最終的にはOptimizelyのポリシーも呼び出されます。したがって、これは、現在のHTTP要求の正しいページコントローラーをロードするために使用されます。
したがって、マッチャーポリシーを知っていることは、CMSのコンテンツをロードできるかどうかを確認することです。ルート値に2つの変数を追加するために、同じシステムに夢中になりました。
- 1つは、このリクエストがどのサイトで行われているかを知るためです。
- どのコンテンツタイプがロードされているかを知るために他の人に。
MultiSiteMatcher これらのルーティング値を次のように追加しています ContentMatcherPolicy Optimizelyから実行されているため、ルーティング値に追加しながら正しいデータをつかむことができることを確認します。
静的資産
マルチサイトのもう1つの課題は、静的資産です。 Optimizely CMSを使用したクラシックセットアップは、特定のサイトのフォルダーを作成することです。 wwwroot そして、そのサイトのすべての資産をその中に保存します。全体として、さまざまなスクリプト、スタイル、フォントなどが必要になる場合があり、必ずしも他のサイトと共有したいとは限りません。
ただし、このセットアップでは、2つのことが起こっています。
- ブラウザは、代わりにサブフォルダーに資産をロードします 見ている ウェブサイトのルートからロードされているように。
- 設計されていない、またはページ内のサイト用に意図されていない他の資産を技術的にロードできます。
もちろん、これらの問題は主に化粧品ですが、このマルチサイト全体のものを正しく閉じる必要があると感じました。
それをカスタマイズし、サイト間の適切な分離を維持する方法があります。新しいものを実装することによって IFileProvider。本質的には非常に簡単です。このファイルプロバイダーは、要求されたサイトのサブパスから直接ファイルを見つけようとしています。
Nugetパッケージとソース
これらの概念はすべて、私のブログの開発中に実装されました。興味があれば、このロジックを最近NUGETパッケージに分けました。
あなたの考えを教えてください!もちろん、プロジェクトに参加して貢献したい場合は、LinkedInからお知らせください!
#構造化された分離を備えた最適化のマルチサイトアーキテクチャを強化します