2017-03-24 18 views
1

私はERPシステムのWebApi ODataサービス(Microsoft.AspNet.OData v6パッケージを使用しています)を作成していますが、少し問題があります。 システムに複数のモジュール(販売、購入、管理など)があり、これをサービスに反映しようとしています。リソースパスの文字列リテラル

たとえば、私は "SalesOrders"エンティティと "PurchaseOrders"エンティティを持っています。これらはお互いに異なっており、私はこれらを異なるODataルート経由で公開したいと考えています。

SalesOrdersの場合、私のルートは~/odata/Sales/Orders、PurchaseOrdersは~/odata/Purchase/Ordersであるべきです。

残念ながら、ODataは「Sales」と「Purchase」が有効なODataパスセグメントではないことを伝え続けているため、これを動作させることができませんでした(これは自分のエンティティではないため正しい)。Resource not found for segment 'Sales'

異なるルートにリンクされた異なるモデルを使用することもできます(ModelBoundODataRouteの回避策を使用してhereを見つけました)。その後、統合された$metadataドキュメントはありません。私はおそらく、カスタムControllerSelector(おそらくNamespaceAwareControllerSelector、またはマーカー属性のいくつかの種類を使用して)を書くことで逃げることができますが、それは可能ならば、むしろ避けるほうが良いワームの可能性があります。最後の手段は、これを分割してPurchaseOrder、SalesOrderというエンティティを使用することだけではありません。

WebApiConfig.Register: 
    public static void Register(HttpConfiguration config) 
    { 
     //OData routes 
     var salesModel = ModelBuilder.GetSalesModel(); // this just builds an edm model with the required entities 
     config.MapModelBoundODataServiceRoute(routeName: "salesRoute", routePrefix: "odata/Sales", configureAction: action => 
     { 
      action.AddDefaultODataServices() 
      .AddService<IEdmModel>(ServiceLifetime.Singleton, s => salesModel) 
      .AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp => 
      { 
       return ODataRoutingConventions.CreateDefault() 
       .Concat(new[] { new ModelBoundODataAttributeRoutingConvention(salesModel, "salesRoute", config) }); 
      }) 
     }); 

     var purchaseModel = ModelBuilder.GetPurchaseModel(); 
     config.MapModelBoundODataServiceRoute(routeName: "purchaseRoute", routePrefix: "odata/Purchase", configureAction: action => 
     { 
      action.AddDefaultODataServices() 
      .AddService<IEdmModel>(ServiceLifetime.Singleton, s => purchaseModel) 
      .AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp => 
      { 
       return ODataRoutingConventions.CreateDefault() 
       .Concat(new[] { new ModelBoundODataAttributeRoutingConvention(purchaseModel, "purchaseRoute", config) }); 
      }) 
     }); 
    } 

単一の統一$メタデータドキュメントを維持しながら、ODataのルートプレフィックスに(リソースにマッピングしていない)リテラル文字列を追加する方法はありますか?

答えて

0

代替オプションは、これはOrdersと呼ばれる含まれているナビゲーションプロパティとOrdersという名前の含まれるナビゲーションプロパティでPurchaseという名前のシングルトンでSalesという名前のシングルトンを持つ伴うだろう

にこれを行うために容器を使用することであってもよいです。これは、~/odata/SalesというURLを使ってシングルトンSalesを要求したときに返されるべきものの興味深い質問を提起しますが、探しているURLが表示されます。非常に...ハックようだ

https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-containment-in-web-api-22

+0

:詳細については、以下のリンクをご覧ください。それはおそらく動作するだろうが。私はおそらく私のコントローラを再訪し、それらのすべてにODataRoutePrefix'esを追加する必要があります。スワッガーの統合がどのように機能するのかよく分かりませんが、確かに試してみてください。 –

関連する問題