1735737117
2024-12-31 16:58:00
最近、Optimizely は、CMS コンテンツのさまざまなフィールドがグラフによってどのようにインデックス付けされるかを管理するための Conventions API をリリースしました。これは、インデックスを作成する内容とインデックスを作成する方法をより簡単に管理できるため、非常に便利なアップデートです。 https://docs.developers.optimizely.com/content-management-system/docs/conventions-api。
一般に、これは Startup.cs のアプリケーションの Configure メソッドで管理します。ドキュメントによると、サービス スコープを作成し、規約リポジトリを取得し、特定のブロックまたはページにフィールドを設定します。
using (var serviceScope = app.ApplicationServices.CreateScope())
{
var services = serviceScope.ServiceProvider;
varconventionRepo = services.GetRequiredService
ConventionRepo.ForInstancesOf
.ExcludeField(p => p.ContentAreaItem1) //フィールドを除外します
.IncludeField(p => p.TermsAndConditions()) //動的フィールドを追加します
// 特定のプロパティのインデックス タイプを設定します
.Set(p => p.Price, IndexingType.Queryable)
.Set(p => p.Heading, IndexingType.Searchable)
.Set(p => p.Quantity, IndexingType.OnlyStored);
ConventionRepo.ExcludeContentType
ConventionRepo.ExcludeAllContentTypes() //一部を除くすべてのコンテンツ タイプを除外します
。を除外する
コンベンションレポ
.IncludeAbstract
.IncludeAbstract
.IncludeInterface
}
そしてこれが優れた機能性です。グラフのインデックス作成をきめ細かく制御します。
これを大規模なサイトのコンテキストで考え始めると、問題が発生します。 Startup.cs に何百行ものコードを追加するのでしょうか?規約を調整するたびに Startup.cs を触る必要がありますか?これはすべてメンテナンスの問題のようです。私たちは、このプロセス全体の保守をより簡単にしたいと考えています。具体的には:
- 私たちのコードは機能フォルダーに編成されています。私たちもこのような方法で大会を開催できるでしょうか?
- 毎回大量のコードに触れることなく、新しいページやブロック、および関連する規則を追加するにはどうすればよいでしょうか?
- 既存のページやブロックとそれらに関連する規則を調整し、変更によって何も損なわれないようにするにはどうすればよいでしょうか?
私たちの最初のアイデアは、Entity Framework が規則を管理する方法と同様に、これらの規則を管理することでした (https://learn.microsoft.com/en-us/ef/core/modeling/) IEntityTypeConfiguration を使用します。規約クラスをグラフ規約に自動的に取り込みたいので、規約の新しいファイルを作成すると、それが自動的に組み込まれ、手順を見逃すことを心配する必要がなくなります。
インターフェースを作成する
最初のステップは、すべての規約で使用されるインターフェイスを作成することです。その後、このインターフェイスを実装する任意のクラスで何らかの作業を行うことができます。
///
/// 各タイプの規約のためのインターフェース
///
パブリック インターフェイス IGraphTypeConventions
{
///
/// 規約を追加するメソッド
///
/// グラフ規約リポジトリ
public void Configure(ConventionRepository ConventionRepository);
}
規約を含むクラスを作成する場合は、このインターフェイスを実装する必要があります。実装例は次のようになります。
///
/// アコーディオン ブロックの規則
///
パブリック クラス AccordionGraphConventions : IGraphTypeConventions
{
///
/// アコーディオン ブロックの規則を追加します
///
/// 規約リポジトリ
public void Configure(ConventionRepository ConventionRepository)
{
// リポジトリがあることを確認します
ArgumentNullException.ThrowIfNull(conventionRepository);
// アコーディオンのグループ化ブロックを設定します
ConventionRepository?.ForInstancesOf
.Set(p => p.Title, IndexingType.Searchable)
.Set(p => p.Description, IndexingType.OnlyStored)
.Set(p => p.IsFaq, IndexingType.Queryable)
.Set(p => p.Items, IndexingType.OnlyStored)
.ExcludeField(p => p.UniqueId);
// アコーディオン項目ブロックを設定します
ConventionRepository?.ForInstancesOf
.Set(p => p.Title, IndexingType.Searchable)
.Set(p => p.Text, IndexingType.OnlyStored)
.ExcludeField(p => p.UniqueId);
}
}
私たちが行う場所:
- リポジトリがあることを確認してください
- AccordionGroupingBlock を構成する
- AccordionItemBlock を構成する
大規模なサイトでは、機能ごとに IGraphTypeConventions の実装が少なくとも 1 つあることが予想されます。
インターフェースのインスタンスを登録する
Startup.cs の ConfigureServices で、すべての規則を Depdency Injection コンテナーに追加します。したがって、グラフを構成した直後に、RegisterAllGraphConventions という新しい ServiceCollection 拡張メソッドを呼び出します。ここで現在のアセンブリを取得し、アセンブリから IGraphConvention のすべての実装を取得して、それらを DI コンテナーに追加します。
*注意: これは、すべてが 1 つの DLL 内にあるアーキテクチャを前提としています。ソリューションが複数の DLL に分散している場合は、すべての IGraphTypeConvention を確実に取得できるようにこれを調整する必要がある場合があります。
///
/// すべてのグラフ規約クラスを登録するための拡張メソッド
///
パブリック静的クラス ServiceCollectionExtensions
{
///
/// IGraphTypeConventions のすべてのインスタンスを登録します
///
///
public static void RegisterAllGraphConventions(この IServiceCollection サービス)
{
// 現在のアセンブリを取得します – すべてが 1 つのアセンブリ内にあります – このアセンブリ
var currentAssembly = Assembly.GetExecutingAssembly();
// アセンブリからすべてのグラフ規約クラスを取得します
var typeFromAssembly =
currentAssembly.DefinedTypes.Where(x => x.GetInterfaces().Contains(typeof(IGraphTypeConventions)));
// 型をループします
foreach (typesFromAssembly の var 型)
{
// DIコンテナに登録します
services.Add(new ServiceDescriptor(typeof(IGraphTypeConventions), type, ServiceLifetime.Transient));
}
}
}
ここでの利点は、新しい規則を追加すると、それらが自動的に登録されることです。これで、Startup.cs から簡単に呼び出すことができます。
// グラフの規則を DI コンテナに追加します
services.RegisterAllGraphConventions();
規則を規則リポジトリに追加する
最後に、これらの規約を実際に ConventionsRepository に追加したいと思います。これは、Startup.cs のアプリケーションの Configure メソッドで行います。実際に登録を実行する拡張メソッドを IApplicationBuilder 上に作成します。このメソッドでは、ドキュメントに記載されているように、サービス プロバイダーを取得してから、ConventionRepository を取得します。ただし、DI コンテナに登録した IGraphTypeConventions のすべてのインスタンスを取得し、それらすべてをループして、各インスタンスで Configure メソッドを呼び出します。
///
/// すべてのグラフ規則を登録するためのアプリケーション ビルダー拡張機能
///
パブリック静的クラス GraphConventions
{
///
/// すべてのグラフ規約を規約リポジトリに追加します
///
///
public static void AddGraphConventions(この IApplicationBuilder アプリ)
{
// スコープを取得する
var serviceScope = app.ApplicationServices.CreateScope(); を使用します。
// サービスプロバイダーを取得する
var services = serviceScope.ServiceProvider;
// 規約リポジトリを取得します
varconventionRepository = services.GetRequiredService
// リポジトリがない場合
if (conventionRepository == null)
{
// そのまま先に進んでください
戻る;
}
// すべてのグラフの規則を取得します
var chartConventions = services.GetAllInstances
// 規約に従ってループします
foreach (graphConventions の var chartConvention)
{
// 各グラフ規則でconfigureメソッドを呼び出します。
グラフConvention.Configure(conventionRepository);
}
}
}
これにより、すべての規則が確実に登録され、新しい規則の追加が非常に簡単になります。これは次のように Configure に追加されます。
// グラフ同期を設定する
app.AddGraphConventions();
テスト
最後に、これらの規約をテストできるようにして、将来規約が変更された場合、テストも更新され、規約が正しく追加されていることを確認するまでテストが失敗するようにしたいと考えています。テストのために使用しています Xユニット、 N代用 そして FluentAssertionsしたがって、別のツールを使用する場合、これらのテストの構文は異なる可能性がありますが、概念は同じである必要があります。
- ConventionsRepository の代替を作成する
- 規約クラスのインスタンスを作成します
- configureメソッドを呼び出す
- この特定のコンテンツ タイプのフィールド規則を取得します
- 規約を確認する
[Fact]
public void Configure_ConfigureAccordionGroupingBlock_ConfigurationIsSet()
{
// 整える
varconventionRepository = Substitute.For
var accordionGraphConventions = new AccordionGraphConventions();
// 活動
accordionGraphConventions.Configure(conventionRepository);
// アサート
var fieldConventions =conventionRepository.GetFieldConventions(typeof(AccordionGroupingBlock));
foreach (fieldConventions の varconventionType)
{
varexcludedFields =conventionType.GetExcludedFields();
varexcludedFieldsArray = 文字列としてのexcludedFields[] ?? ExcludedFields.ToArray();
excludsFieldsArray.Length.Should().Be(1);
excludedFieldsArray.FirstOrDefault().Should().Be(nameof(AccordionGroupingBlock.UniqueId));
varindexedFields =conventionType.GetFieldsWithIndexingSetting();
varindexedFieldsArray = 文字列としてのindexedFields[] ?? IndexedFields.ToArray();
IndexedFieldsArray.Length.Should().Be(4);
IndexedFieldsArray.Should().Contain(nameof(AccordionGroupingBlock.Title));
IndexedFieldsArray.Should().Contain(nameof(AccordionGroupingBlock.Description));
IndexedFieldsArray.Should().Contain(nameof(AccordionGroupingBlock.IsFaq));
IndexedFieldsArray.Should().Contain(nameof(AccordionGroupingBlock.Items));
ConventionType.GetIndexingType(nameof(AccordionGroupingBlock.Title)).Should().Be(IndexingType.Searchable);
ConventionType.GetIndexingType(nameof(AccordionGroupingBlock.Description)).Should().Be(IndexingType.OnlyStored);
ConventionType.GetIndexingType(nameof(AccordionGroupingBlock.IsFaq)).Should().Be(IndexingType.Queryable);
ConventionType.GetIndexingType(nameof(AccordionGroupingBlock.Items)).Should().Be(IndexingType.OnlyStored);
}
}
したがって、次のいずれかがテストに失敗すると確信できるため、変更を調べて、それらが正しいことを確認する必要があります。
- コンベクションから除外される番号やフィールドを変更する
- 規約に含まれる数値やフィールドを変更する
- 特定のフィールドのインデックスの種類を変更する
結論
全体として、Conventions API は、Graph がコンテンツにインデックスを付ける方法を管理するのに役立つ Optimizely の優れた機能です。上記で概説した方法を使用すると、ソリューションに合わせて拡張できる、維持しやすい規則が得られます。
2024 年 12 月 31 日
#グラフの規則を管理する #Optimizely #開発者コミュニティ