Esempio n. 1
0
        /// <summary>
        /// Maps the OData service.
        /// </summary>
        /// <param name="config">The current HTTP configuration.</param>
        /// <param name="builder">The EDM model builder.</param>
        /// <param name="routeName">The name of the route (<see cref="DataObjectRoutingConventions.DefaultRouteName"/> be default).</param>
        /// <param name="routePrefix">The route prefix (<see cref="DataObjectRoutingConventions.DefaultRoutePrefix"/> be default).</param>
        /// <returns>OData service registration token.</returns>
        public static ManagementToken MapODataServiceDataObjectRoute(
            this HttpConfiguration config,
            IDataObjectEdmModelBuilder builder,
            string routeName   = DataObjectRoutingConventions.DefaultRouteName,
            string routePrefix = DataObjectRoutingConventions.DefaultRoutePrefix)
        {
            Contract.Requires <ArgumentNullException>(config != null);
            Contract.Requires <ArgumentNullException>(builder != null);
            Contract.Requires <ArgumentNullException>(routeName != null);
            Contract.Requires <ArgumentException>(routeName != string.Empty);
            Contract.Requires <ArgumentNullException>(routePrefix != null);
            Contract.Requires <ArgumentException>(routePrefix != string.Empty);

            // Model.
            var model = builder.Build();

            // Routing.
            var pathHandler        = new ExtendedODataPathHandler();
            var routingConventions = DataObjectRoutingConventions.CreateDefault();
            var route = config.MapODataServiceRoute(routeName, routePrefix, model, pathHandler, routingConventions);

            // Controllers.
            var registeredActivator = (IHttpControllerActivator)config.Services.GetService(typeof(IHttpControllerActivator));
            var fallbackActivator   = registeredActivator ?? new DefaultHttpControllerActivator();

            config.Services.Replace(typeof(IHttpControllerActivator), new DataObjectControllerActivator(fallbackActivator));

            // Formatters.
            var customODataSerializerProvider     = new CustomODataSerializerProvider();
            var extendedODataDeserializerProvider = new ExtendedODataDeserializerProvider();
            var odataFormatters = ODataMediaTypeFormatters.Create(customODataSerializerProvider, extendedODataDeserializerProvider);

            config.Formatters.InsertRange(0, odataFormatters);
            config.Properties[typeof(CustomODataSerializerProvider)] = customODataSerializerProvider;

            // Token.
            var token = new ManagementToken(route, model);

            config.SetODataServiceToken(token);

            // Handlers.
            if (config.MessageHandlers.FirstOrDefault(h => h is PostPatchHandler) == null)
            {
                config.MessageHandlers.Add(new PostPatchHandler());
            }

            return(token);
        }
        public BaseODataServiceIntegratedTest(
            string stageCasePath             = @"РТЦ Тестирование и документирование\Модели для юнит-тестов\Flexberry ORM\NewPlatform.Flexberry.ORM.ODataService.Tests\",
            bool useNamespaceInEntitySetName = false, bool useGisDataService = false)
            : base("ODataDB", useGisDataService)
        {
            DataObjectsAssembliesNames = new[]
            {
                typeof(Car).Assembly,
                //typeof(Agent).Assembly
            };
            UseNamespaceInEntitySetName = useNamespaceInEntitySetName;
            var builder = new DefaultDataObjectEdmModelBuilder(DataObjectsAssembliesNames, UseNamespaceInEntitySetName);

            //builder.PropertyFilter = PropertyFilter;
            _builder = builder;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PerRequestUpdateEdmModelHandler"/> class.
        /// </summary>
        /// <param name="token">The OData Service management token.</param>
        /// <param name="modelBuilder">
        /// The model builder for updating model.
        /// Each request EDM model associated with <paramref name="token"/> will be updated.
        /// </param>
        public PerRequestUpdateEdmModelHandler(ManagementToken token, IDataObjectEdmModelBuilder modelBuilder)
        {
            Contract.Requires <ArgumentNullException>(token != null);
            Contract.Requires <ArgumentNullException>(modelBuilder != null);

            // In current Microsoft implementation of OData for WebAPI, EDM model is stored
            // in ODataPathRouteConstraint, but doesn't have public setter.
            // In order to rebuild EDM model for different requests (e.g. authorized users),
            // this handler uses reflection for private setter calling.
            _edmModelProperty = typeof(ODataPathRouteConstraint).GetProperty("EdmModel");
            if (_edmModelProperty == null)
            {
                throw new InvalidOperationException("Current OData API cannot be used for editing EDM model.");
            }

            _token        = token;
            _modelBuilder = modelBuilder;
        }
        public DataObjectEdmModel(DataObjectEdmMetadata metadata, IDataObjectEdmModelBuilder edmModelBuilder = null)
        {
            Contract.Requires <ArgumentNullException>(metadata != null);
            EdmModelBuilder = edmModelBuilder;
            var container = UnityFactory.GetContainer();

            if (container != null)
            {
                if (container.IsRegistered <IExportService>("Export"))
                {
                    ExportService = container.Resolve <IExportService>("Export");
                }

                if (container.IsRegistered <IExportService>())
                {
                    ExportService = container.Resolve <IExportService>();
                }

                if (container.IsRegistered <IODataExportService>("Export"))
                {
                    ODataExportService = container.Resolve <IODataExportService>("Export");
                }

                if (container.IsRegistered <IODataExportService>())
                {
                    ODataExportService = container.Resolve <IODataExportService>();
                }
            }

            _metadata = metadata;

            BuildTypeHierarchy();
            BuildEdmEntityTypes();
            BuildEntitySets();
            RegisterMasters();
            RegisterDetails();
            RegisterGeoIntersectsFunction();
            RegisterGeomIntersectsFunction();
        }