Я использую 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);
}