私は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のルートプレフィックスに(リソースにマッピングしていない)リテラル文字列を追加する方法はありますか?
:詳細については、以下のリンクをご覧ください。それはおそらく動作するだろうが。私はおそらく私のコントローラを再訪し、それらのすべてにODataRoutePrefix'esを追加する必要があります。スワッガーの統合がどのように機能するのかよく分かりませんが、確かに試してみてください。 –