具有多个名称空间的ODataConventionModelBuilder

时间:2014-12-29 12:17:37

标签: odata-v4

这要么超级直接,要么相对容易回答。我有以下代码来设置我的OData路由约定:

// OData
var builder = new ODataConventionModelBuilder();

// OData entity sets..
builder.EntitySet<Book>("Books");
builder.EntitySet<Shelf>("Shelves");

// Bound Function..has to be located on the Tables Controller...
builder.Namespace = "BookService";
builder.EntityType<Table>().Collection
    .Function("MostRecent")
    .Returns<DateTimeOffset>();

builder.Namespace = "ShelfService";
builder.EntityType<Shelf>()
    .Action("NearestEmptyShelf");

...但问题是,当应用程序启动时,所有内容都会针对ShelfService进行路由,而不是可以从BookService.MostRecentShelfService.NearestEmptyShelf访问的第一个函数。

我确定其他人在为其OData控制器创建服务(操作/功能)时遇到了这个特定问题。但是,我在关于您是否可以在OData路由集合中拥有多个名称空间的明确答案之后呢?

2 个答案:

答案 0 :(得分:2)

您正在使用builder.Namespace = "Bookservice";覆盖builder.Namespace = "ShelfService";的命名空间。

要使用两个单独的命名空间,您需要两个单独的new ODataConventionModelBuilder();

实例

以下是OData V4

// Book OData Endpoint
var book_builder = new ODataConventionModelBuilder();

// Book OData entity sets..
book_builder.EntitySet<Book>("Books");

// Book Bound Function..has to be located on the Tables Controller...
book_builder.Namespace = "BookService";
book_builder.EntityType<Table>().Collection
    .Function("MostRecent")
    .Returns<DateTimeOffset>();
// Book Config
config.MapODataServiceRoute(
    routeName: "OData - Book",
    routePrefix: "book",
    model: book_builder.GetEdmModel()                
    );

// Shelf OData Endpoint
var shelf_builder = new ODataConventionModelBuilder();

// Shelf OData Entity Sets
shelf_builder.EntitySet<Shelf>("Shelves");

// Shelf Bound Function..has to be located on the Tables Controller...
shelf_builder.Namespace = "ShelfService";
shelf_builder.EntityType<Shelf>()
    .Action("NearestEmptyShelf");
    .Returns<whatever you planned on returning>()
//Shelf Config
config.MapODataServiceRoute(
    routeName: "OData - Shelf",
    routePrefix: "shelf",
    model: shelf_builder.GetEdmModel()                
    );

自从我实现了这种机制以来已经有一段时间了,但您可能需要覆盖AttributeRoutingConvention以使用上述方法在多个命名空间/控制器中使用绑定函数。我知道我在某个时刻遇到了打扰,最终找到了public class CustomAttributeRoutingConvention : AttributeRoutingConvention的堆栈溢出的好方法,该方法使用public static class HttpConfigExt提供CustomMapODataServiceRoute来解决问题。< / p>

答案 1 :(得分:0)

这已经有一段时间了,因为这个问题得到了解答,但我最近遇到了这个问题并找到了另一种解决方案,所以它就这样......

...
builder.Namespace = "Namespace_A"; // This would be the default namespace
...
function = builder.EntityType<EntityA>()
    .Collection
    .Function("FunctionInNamespace_B")
    .ReturnsCollection<EntityB>();
function.Namespace = "Namespace_B";

绝对简单,就像魅力一样。