这要么超级直接,要么相对容易回答。我有以下代码来设置我的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.MostRecent
和ShelfService.NearestEmptyShelf
访问的第一个函数。
我确定其他人在为其OData控制器创建服务(操作/功能)时遇到了这个特定问题。但是,我在关于您是否可以在OData路由集合中拥有多个名称空间的明确答案之后呢?
答案 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";
绝对简单,就像魅力一样。