0

クロスポスト: https://orchard.codeplex.com/discussions/459007

最初の質問は、2 つの異なるモジュールで同じパーツに対して 2 つの PartHandlers を使用すると、どのような影響があるかということです。

特定のコンテンツ タイプが作成されたらメソッドを実行する必要があるため、この苦境に陥りました。その部分を OnCreated にフックするのは簡単ですが、私のシナリオは次のとおりです。

  • モジュール A には、パーツと元のハンドラーが含まれています
  • モジュール B には、メソッドが存在するサービスが含まれています。
  • モジュール B にはモジュール A への参照があります

したがって、モジュール A 内でモジュール B を参照できません (循環参照)。そこで私がしたことは、まったく同じ PartHandler をモジュール A にコピーし、それをモジュール B に配置することでした。

それで何か問題がありますか?

次に 2 番目の質問があります。これでこれらすべての問題を解決できると思います。コンテンツ アイテムのデフォルトのコンテンツ パーツの PartHandler を作成できますか? (つまり、すべてのカスタム フィールドが接続されている部分)

そこで実行する必要があるものを統合できるので、これは間違いなく物事を簡単にするでしょう.

UPDATE 1(質問2をよりよく説明するため)

    ContentDefinitionManager.AlterPartDefinition("EventItem",           
      builder => builder                         
                    .WithField("StartDate", cfg => cfg
                        .OfType("DateTimeField")
                        .WithDisplayName("Start Date")
                        .WithSetting("DateTimeFieldSettings.Display", "DateOnly")
                        .WithSetting("DateTimeFieldSettings.Required", "true"))
                    .WithField("StartTime", cfg => cfg
                        .OfType("DateTimeField")
                        .WithDisplayName("Start Time")
                        .WithSetting("DateTimeFieldSettings.Display", "TimeOnly"))
                    .WithField("EndDate", cfg => cfg
                        .OfType("DateTimeField")
                        .WithDisplayName("End Date")
                        .WithSetting("DateTimeFieldSettings.Display", "DateOnly"))
                    .WithField("EndTime", cfg => cfg
                        .OfType("DateTimeField")
                        .WithDisplayName("End Time")
                        .WithSetting("DateTimeFieldSettings.Display", "TimeOnly"))
                    .WithField("Intro", cfg => cfg
                        .OfType("TextField")
                        .WithDisplayName("Intro")
                        .WithSetting("TextFieldSettings.Flavor", "textarea"))

    ContentDefinitionManager.AlterTypeDefinition(
        "EventItem"
        , cfg =>
            cfg
                .DisplayedAs("Event Item")                        
                .WithPart("TitlePart")
                .WithPart("EventItem")
                .WithPart("LocationPart")   
                .WithPart("AutoroutePart", builder => builder
                    .WithSetting("AutorouteSettings.AllowCustomPattern", "true")
                    .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "false")
                    .WithSetting("AutorouteSettings.PatternDefinitions", "[{Name:'Title', Pattern: 'learn/events/{Content.Slug}', Description: 'learn/events/event-title'}]")
                    .WithSetting("AutorouteSettings.DefaultPatternIndex", "0"))
                .WithPart("CommonPart")
                .Draftable()
                .Creatable()
    );

すべてのカスタム フィールドを保持する EventItem パーツの ContentHandler を作成することについて話しているのです。EventItemPart がソリューション内のどのクラスでも定義されていない場合、どうすればよいですか?

クラス EventItemPart が見つからないため、以下は機能しません。

OnCreated<EventItemPart>((context, keynotes) =>
    questionService.SetDefaultQuestions(context.ContentItem));
4

2 に答える 2

1

クロスアンサーも。

  1. ベルトランの言う通りです。そもそも A で B を参照する必要があるのはなぜですか? B からのサービスが A を必要とし、A がこのサービスを必要とする場合、それは A に属します (少なくともインターフェース - コントラクト)。

    サービスのインターフェイスと実際の実装をいつでも分割して、一方を別のモジュールに配置できます。サービスの実装に B からのものが必要な場合は、インターフェイスを A に配置しますが、実際の実装は B に配置します。この方法では、A は B の存在を知る必要さえありませんが、インターフェイスを介してサービスを使用できます。 - IoC パターンとオーチャードのモジュール性の美しさです:)

  2. ContentPartorIContentをハンドラーのジェネリック メソッドの型引数として使用できます。それは完全に有効です。このようにして、すべてのアイテムのイベントにプラグインし、後でカスタム フィルタリングを実行できます (タイプ名、フィールドの存在などに基づいて)。あなたの場合、次のようになります。

    OnCreated<ContentPart>((context, part) => 
    {
        if(part.ContentItem.ContentType != "EventItem") return;
        questionService.SetDefaultQuestions(context.ContentItem);
    });
    

更新:これを行う必要はありません: .WithPart("EventItem"). この「偽」の部分は、フレームワークによって自動的に追加されます。

于 2013-09-25T03:04:29.627 に答える
1

クロスアンサー:

  1. なし ただし、特に悪い理由で行われた場合は特に、同じことを繰り返すことはほとんどの場合間違っています。サービスとパーツが 2 つの異なるモジュールにあるのはなぜですか? なぜAはBを必要とするのですか? 循環参照は密結合を示します。密結合が正当化される場合、それは単一のモジュールで発生するはずです。そうでない場合は、デザインをやり直して削除する必要があります。

  2. 何でもハンドラーを作成できますが、シナリオの説明はあいまいで抽象的なため、有用なアドバイスを提供できません。

于 2013-09-25T00:57:23.800 に答える