2

シェイプを有効にした後、自分のレイアウトにシェイプを挿入しようとしています。私はIShapeFactoryEventsがこれには完璧だと考えましたが、POST中にこの問題が発生した場合、ここからCMSに問い合わせると「TransactionScope入れ子に間違った例外」が表示されます。誰かが私のために知恵の言葉をもう一度持っていたのだろうか?下記の私のコードスニペットを見てください。IShapeFactoryEventsからオーチャードCMSに問い合わせする

public void Created(ShapeCreatedContext context) 
    { 
     if (context.ShapeType == "Layout") 
     {     
      if (!AdminFilter.IsApplied(_services.WorkContext.HttpContext.Request.RequestContext)) 
      { 
       var route = RouteTable.Routes.GetRouteData(_services.WorkContext.HttpContext); 
       object location; 
       if (route.Values.TryGetValue("location", out location)) 
       { 
        var region = _services.ContentManager.Query("Region") 
         .Join<RoutePartRecord>() 
         .Where(x => x.Slug == (string)location) 
         .Slice(1).FirstOrDefault(); 

        context.Shape.Header.Add(context.New.CurrentRegion(Title: region.As<RoutePart>().Title), "10"); 
       } 
       context.Shape.Navigation.Add(context.New.RegionSelector(Regions: _services.ContentManager.Query(VersionOptions.Published, "Region").List()), "11"); 
      } 
     } 
    } 

もう一度、前もって感謝します。あなたは素晴らしいです。

答えて

1

私はここに、この非常に話題にやったブログ記事を参照してください、「

私は注意する必要がある一つのことを、これは発見するために丸一日かかった:ブログ記事からhttp://chrisbower.com/2011/02/15/orchard-shape-wizardry/

IShapeTableProviderの実装にデータサービスを注入するだけでは問題がありません。そうした場合、範囲外のトランザクションを使用しようとすると、あらゆる種類の問題が発生します。最後に、OrchardチームがCoreShapesクラスの内部で何をしているのかを発見しました。プロパティを使用して関数自体の中でサービスの依存関係を解決するトリック要求ごとにサービスをロードする」

ではなく、このようなあなたのサービスを使用してみてください:クリス・バウアー@

private IOrchardServices Services  
{ 
    get 
    { 
     return _workContextAccessor.GetContext(_httpContextAccessor.Current()).Resolve<IOrchardServices>(); 
    } 
} 
+0

おかげで、御馳走を働きました。あなたのサイトはどのように進んでいますか?まだ生産中ですか? – Brendan

+0

@Brendan - うん、私たちは6月にそれを開始した:[aclj.org](http://aclj.org) –

+0

@Chrisもう一つの解決策は 'Tsh'の代わりに' Work 'を' IShapeTableProvider'の実装ctor。次に、 'Work 'の 'Value'プロパティを介して基礎となるオブジェクトにアクセスできます。現在のコンテキストに適したインスタンスを返します。要求ごとの依存関係をシングルトンの依存関係に挿入する必要がある場合に便利です。 –

関連する問題