2014-12-29 20 views
5

Questo è semplicemente super diretto o è relativamente facile da rispondere. Ho il seguente codice al fine di impostare le mie Convenzioni OData routing:ODataConventionModelBuilder con più spazi dei nomi

// 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"); 

... Ma il problema con questo è quando si avvia l'applicazione, tutto è indirizzato contro ShelfService piuttosto che la prima funzione essendo accessibile da BookService.MostRecent e ShelfService.NearestEmptyShelf.

Sono sicuro che altri si sono imbattuti in questo particolare problema durante la creazione di servizi (azioni/funzioni) per i loro controller OData. Ma sono appena dopo una risposta definitiva se è possibile avere più spazi dei nomi nella collezione di routing OData?

risposta

0

Si sta sovrascrivendo lo spazio dei nomi di builder.Namespace = "Bookservice"; con builder.Namespace = "ShelfService";.

Per utilizzare due spazi dei nomi separati avete bisogno di due istanze separate di new ODataConventionModelBuilder();

Il sotto è per 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()     
    ); 

E 'stato un po' che ho implementato questo meccanismo, ma si possono avere per sovrascrivere AttributeRoutingConvention per utilizzare le funzioni associate in più domini/controller utilizzando il metodo precedente. So che ho avuto un singhiozzo con esso a un certo punto e ho finito per trovare un buon metodo di overflow dello stack per un public class CustomAttributeRoutingConvention : AttributeRoutingConvention che utilizzava uno public static class HttpConfigExt per fornire un CustomMapODataServiceRoute per risolvere il problema.

+0

Grazie! Farò un crack e vedrò come va –