2014-12-29 2 views
5

Это либо супер прямое, либо относительно легко ответить. У меня есть следующий код, чтобы настроить свои OData маршрутизации конвенции:ODataConventionModelBuilder с несколькими пространствами имен

// 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

Вы заменяете свое пространство имен 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, чтобы исправить эту проблему.

+0

Спасибо! Я дам ему трещину и посмотрю, как это происходит –

Смежные вопросы