2016-11-28 7 views
0

Я использую API OData ASP.NET, версия 6.0 Я создаю модель EDM, используя безликие объекты. Причина в том, что у меня есть семантическая модель данных в моей базе данных, операции crud по любому типу объектов выполняются с использованием одного и того же кода. Поэтому мне просто нужно сделать один контроллер, который анализирует строку запроса OData и применить его к моему родному способу загрузки объектов. Я почти все это работаю. Что-то не удалось определить динамику маршрутизации каким-то образом ....ASP.NET OData, маршрут безлимитных/нетипизированных объектов к тому же контроллеру

Так как я могу сопоставить сущности x, y и z, чтобы использовать один и тот же контроллер ??

Мой код для построения модели выглядит так, как показано ниже. Это будет направлено на контроллеры с именем IdentitiesController, ResourcesController, SystemsController и OrgunitsController. Но они должны все маршрутизировать на тот же контроллер «NativeObjectsController» ....

Ниже приведен только набор возможных типов сущностей ... и enduser может создавать свои собственные типы, поэтому я не могу просто создавать специализированные контроллеры ...

public static void Register(HttpConfiguration config) 
{ 
    IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); 
    IODataPathHandler pathHandler = new DefaultODataPathHandler(); 

    config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "odata/dataobjects", 
    model: GetEntityModel() 
    // ,pathHandler: pathHandler, 
    //routingConventions: routingConventions 
); 

    var routes = config.Routes; 
    config.AddODataQueryFilter(); 
    config.EnsureInitialized(); 
} 

public static EdmModel GetEntityModel() 
{ 
    if (model != null) 
    return model; 

    model = new EdmModel(); 
    EdmEntityContainer container = new EdmEntityContainer(ns_ois, "OISContainer"); 
    model.AddElement(container); 

    AddDataObjectTypeToModel(model, container, "IDENTITY", "Identities"); 
    AddDataObjectTypeToModel(model, container, "RESOURCE", "Resources"); 
    AddDataObjectTypeToModel(model, container, "SYSTEM", "Systems"); 
    AddDataObjectTypeToModel(model, container, "ORGUNIT", "OrgUnits"); 

    return model; 
} 

private static void AddDataObjectTypeToModel(EdmModel model, EdmEntityContainer container, string dataObjectSystemName, string entitySetName) 
{ 
    DataObjectTypeController dotController = Factory.Default.CreateController<DataObjectTypeController>(); 
    int dotId = dotController.GetId(dataObjectSystemName); 
    DataObjectType dot = dotController.GetDataObjectType(dotId); 

    var entityObject = new EdmEntityType(ns_ois, dataObjectSystemName); 
    model.AddElement(entityObject); 
    entityObject.AddKeys(entityObject.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32, false)); 
    entityObject.AddStructuralProperty("UId", EdmPrimitiveTypeKind.Guid, false); 
    entityObject.AddStructuralProperty("DisplayName", EdmPrimitiveTypeKind.String, false); 

    foreach (var property in dot.GetProperties()) 
    { 
    } 

    var entitySet = container.AddEntitySet(entitySetName, entityObject); 
} 

ответ

0

Пока я создал мой IODataRoutingConvention, чтобы быть в состоянии выбрать контроллер.

public class DataObjectTypeRoutingConvention : IODataRoutingConvention 
{ 
    public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) 
    { 
    return null; 
    } 

    public string SelectController(ODataPath odataPath, HttpRequestMessage request) 
    { 
    if (odataPath.PathTemplate.StartsWith("~/entityset",System.StringComparison.InvariantCultureIgnoreCase)) 
     return "DataObjects"; 
    else 
     return null; 
    } 
} 

, а затем я добавлен в качестве первой конвенции

public static void Register(HttpConfiguration config) 
{ 
    IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); 
    IODataPathHandler pathHandler = new DefaultODataPathHandler(); 

    routingConventions.Insert(0, new Controllers.DataObjectTypeRoutingConvention()); 

    config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "odata/dataobjects", 
    model: GetEntityModel(), 
    pathHandler: pathHandler, 
    routingConventions: routingConventions 
); 

    config.AddODataQueryFilter(); 

    config.EnsureInitialized(); 
} 

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

  • Нет связанных вопросов^_^