C# 资源路径中的字符串文字

C# 资源路径中的字符串文字,c#,asp.net-web-api2,odata,C#,Asp.net Web Api2,Odata,我正在为一个ERP系统编写一个WebApi OData服务(使用Microsoft.AspNet.ODatav6包),我遇到了一些问题。 该系统有多个模块(销售、采购、管理…),我正试图在我的服务中反映这一点 例如,我有一个实体“SalesOrders”和一个实体“PurchaseOrders”。这些是彼此不同的,我想通过不同的OData路线来展示这些 对于销售订单,我希望我的路线是~/odata/Sales/Orders,而PurchaseOrders应该在~/odata/Purchase/O

我正在为一个ERP系统编写一个WebApi OData服务(使用
Microsoft.AspNet.OData
v6包),我遇到了一些问题。 该系统有多个模块(销售、采购、管理…),我正试图在我的服务中反映这一点

例如,我有一个实体“SalesOrders”和一个实体“PurchaseOrders”。这些是彼此不同的,我想通过不同的OData路线来展示这些

对于销售订单,我希望我的路线是
~/odata/Sales/Orders
,而PurchaseOrders应该在
~/odata/Purchase/Orders

不幸的是,我一直无法实现这一点,因为OData一直告诉我“销售”和“购买”不是有效的OData路径段(这是正确的,因为它们不是我的实体):
未找到段“销售”的资源。

我可以使用不同的模型,链接到不同的路由(使用找到的ModelBoundODataRoute的变通方法),但这样我就没有统一的
$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) });
            })
        });
    }
WebApiConfig.Register:
公共静态无效寄存器(HttpConfiguration配置)
{
//奥达塔航线
var salesModel=ModelBuilder.GetSalesModel();//这只是用所需的实体构建一个edm模型
config.mapmodelbundodataServiceRoute(routeName:“salesRoute”,routePrefix:“odata/Sales”,configureAction:action=>
{
action.addDefaultOdatServices()
.AddService(ServiceLifetime.Singleton,s=>salesModel)
.AddService(ServiceLifetime.Singleton,sp=>
{
返回ODataRoutingConventions.CreateDefault()
.Concat(新[]{new modelbundodataattributeroutingconvention(salesModel,“salesRoute”,config)});
})
});
var purchaseModel=ModelBuilder.GetPurchaseModel();
config.mapmodelbundodataServiceRoute(routeName:“purchaseRoute”,routePrefix:“odata/Purchase”,configureAction:action=>
{
action.addDefaultOdatServices()
.AddService(ServiceLifetime.Singleton,s=>purchaseModel)
.AddService(ServiceLifetime.Singleton,sp=>
{
返回ODataRoutingConventions.CreateDefault()
.Concat(新[]{new modelbundodataattributeroutingconvention(purchaseModel,“purchaseRoute”,config)});
})
});
}

有没有办法在保留单个统一的$metadata文档的同时,向OData路由前缀添加字符串文字(而不是映射到资源)?

另一种选择可能是使用包含来执行此操作

这将涉及一个名为
Sales
的单身汉,其中包含名为
Orders
的导航属性;一个名为
Purchase
的单身汉,其中包含名为
Orders
的导航属性。这确实提出了一个有趣的问题,即当您使用URL
~/odata/Sales
请求singleton
Sales
时,应该返回什么,但它会提供您正在查找的URL。有关详细信息,请参阅以下链接:


另一种选择可能是使用安全壳来实现这一点

这将涉及一个名为
Sales
的单身汉,其中包含名为
Orders
的导航属性;一个名为
Purchase
的单身汉,其中包含名为
Orders
的导航属性。这确实提出了一个有趣的问题,即当您使用URL
~/odata/Sales
请求singleton
Sales
时,应该返回什么,但它会提供您正在查找的URL。有关详细信息,请参阅以下链接:


这似乎非常。。。哈奇。尽管它可能会起作用。我可能不得不重新访问我的控制器,并为每个控制器添加ODataRoutePrefix。我不确定我的招摇过市的集成将如何使用它,但肯定要尝试一些东西。这似乎非常。。。哈奇。尽管它可能会起作用。我可能不得不重新访问我的控制器,并为每个控制器添加ODataRoutePrefix。我不确定我的招摇过市的集成将如何使用它,但肯定要尝试一些东西。