Ejemplo n.º 1
0
        protected ODataQueryOptions <T> GetOdataQueryOptions <T>(ControllerBase controller, string uriString = "http://localhost:9000/api/any?$top=5") where T : class
        {
            var provider = GetServiceProvider();

            var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == provider));

            routeBuilder.EnableDependencyInjection();

            var modelBuilder = new ODataConventionModelBuilder(provider);

            modelBuilder.EntitySet <T>(typeof(T).Name);
            var model = modelBuilder.GetEdmModel();

            var uri = new Uri(uriString);

            var httpContext = GetHttpContext(provider);

            HttpRequest req = new DefaultHttpRequest(httpContext)
            {
                Method      = "GET",
                Host        = new HostString(uri.Host, uri.Port),
                Path        = uri.LocalPath,
                QueryString = new QueryString(uri.Query)
            };

            var context = new ODataQueryContext(model, typeof(T), new Microsoft.AspNet.OData.Routing.ODataPath());

            return(new ODataQueryOptions <T>(context, req));
        }
        public static IQueryable ApplyTo <TEntity>(this HttpRequest request, IQueryable <TEntity> query)
            where TEntity : class
        {
            // Parte 1 - Se registran los componentes requeridos por la implementación de
            // Microsoft ASP.NET Core OData y se memorizan en una variable estática
            if (_provider == null)
            {
                var collection = new ServiceCollection();
                collection.AddMvcCore(options =>
                {
                    options.EnableEndpointRouting = false;
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

                collection.AddOData();
                collection.AddTransient <ODataUriResolver>();
                collection.AddTransient <ODataQueryValidator>();
                collection.AddTransient <TopQueryValidator>();
                collection.AddTransient <FilterQueryValidator>();
                collection.AddTransient <SkipQueryValidator>();
                collection.AddTransient <OrderByQueryValidator>();
                _provider = collection.BuildServiceProvider();
            }

            // Parte 2 - Se configura la ruta de ASP.NET Core OData
            if (_routeBuilder == null)
            {
                _routeBuilder = new RouteBuilder(new ApplicationBuilder(_provider));
                _routeBuilder.EnableDependencyInjection();
            }

            // Parte 3 - Se simula un pedido HTTP como si viniese desde ASP.NET Core
            var modelBuilder = new ODataConventionModelBuilder(_provider);

            modelBuilder.AddEntityType(typeof(TEntity));
            var edmModel = modelBuilder.GetEdmModel();

            var httpContext = new DefaultHttpContext
            {
                RequestServices = _provider
            };
            HttpRequest req = new DefaultHttpRequest(httpContext)
            {
                Method      = "GET",
                Host        = request.Host,
                Path        = request.Path,
                QueryString = request.QueryString
            };

            var oDataQueryContext = new ODataQueryContext(edmModel, typeof(TEntity), new Microsoft.AspNet.OData.Routing.ODataPath());
            var odataQuery        = new ODataQueryOptions <TEntity>(oDataQueryContext, req);

            // Parte 4 - Se aplica la consulta OData al queryable que nos pasan por parámetro
            return(odataQuery.ApplyTo(query.AsQueryable()));
        }
Ejemplo n.º 3
0
        public static IQueryable ApplyTo <TEntity>(this HttpRequest request, IQueryable <TEntity> query)
            where TEntity : class
        {
            // Part 1 - The components required by the implementation of
            // Microsoft ASP.NET Core OData and are stored in a static variable
            if (_provider == null)
            {
                var collection = new ServiceCollection();
                collection.AddMvc().AddNewtonsoftJson();
                collection.AddLogging();
                collection.AddOData();
                collection.AddTransient <ODataUriResolver>();
                collection.AddTransient <ODataQueryValidator>();
                collection.AddTransient <TopQueryValidator>();
                collection.AddTransient <FilterQueryValidator>();
                collection.AddTransient <SkipQueryValidator>();
                collection.AddTransient <OrderByQueryValidator>();
                _provider = collection.BuildServiceProvider();
            }

            // Part 2 - ASP.NET Core OData path is configured
            if (_routeBuilder == null)
            {
                _routeBuilder = new RouteBuilder(new ApplicationBuilder(_provider));
                _routeBuilder.EnableDependencyInjection();
            }

            // Part 3 - An HTTP request is simulated as if it came from ASP.NET Core
            var modelBuilder = new ODataConventionModelBuilder(_provider);

            modelBuilder.AddEntityType(typeof(TEntity));
            var edmModel = modelBuilder.GetEdmModel();

            var httpContext = request.HttpContext;

            httpContext.RequestServices = _provider;

            HttpRequest req = request;

            req.Method      = "GET";
            req.Host        = request.Host;
            req.Path        = request.Path;
            req.QueryString = request.QueryString;
            req.HttpContext.RequestServices = _provider;


            var oDataQueryContext = new ODataQueryContext(edmModel, typeof(TEntity), new Microsoft.AspNet.OData.Routing.ODataPath());
            var odataQuery        = new ODataQueryOptions <TEntity>(oDataQueryContext, req);

            // Part 4 - The OData query is applied to the queryable that is passed to us by parameter
            return(odataQuery.ApplyTo(query.AsQueryable()));
        }
Ejemplo n.º 4
0
        public static void ClassInitialize(TestContext testContext)
        {
            var builder = new ODataConventionModelBuilder();
            var type    = typeof(MockOpenType);
            var entityTypeConfiguration = builder.AddEntityType(type);

            entityTypeConfiguration.HasKey(type.GetProperty("Id"));
            builder.AddEntitySet(type.Name, entityTypeConfiguration);
            var conf = builder.EntitySet <MockOpenType>(type.Name);

            conf.EntityType.Property(p => p.Id).Name = "id";

            var edmModels = builder.GetEdmModel();

            ODataQueryContext = new ODataQueryContext(edmModels, type, new ODataPath());

            var collection = new ServiceCollection();

#if NET6_0
            collection
            .AddControllers()
            .AddOData();
#else
            collection.AddOData();
#endif

            collection.AddODataQueryFilter();
            collection.AddTransient <ODataUriResolver>();
            collection.AddTransient <ODataQueryValidator>();
            collection.AddTransient <TopQueryValidator>();
            collection.AddTransient <FilterQueryValidator>();
            collection.AddTransient <SkipQueryValidator>();
            collection.AddTransient <OrderByQueryValidator>();

#if NET6_0
            collection.AddTransient <ILoggerFactory, TestLoggingFactory>();
#endif

            Provider = collection.BuildServiceProvider();

            var applicationBuilder = Substitute.For <IApplicationBuilder>();
            applicationBuilder.ApplicationServices.Returns(Provider);

#if !NET6_0
            var routeBuilder = new RouteBuilder(applicationBuilder);
            routeBuilder.EnableDependencyInjection();
#endif
        }
Ejemplo n.º 5
0
        protected void BeforeEachBenchmark(int recordCount)
        {
            var collection = new ServiceCollection();

            collection.AddOData();
            collection.AddODataQueryFilter();
            _provider = collection.BuildServiceProvider();
            var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == _provider));

            routeBuilder.EnableDependencyInjection();
            _oDataRequestHelper      = new ODataRequestHelper();
            _edmEntityTypeSettings   = GetEdmEntityTypeSettings();
            _httpContext             = new DefaultHttpContext();
            _genericEntityRepository = new GenericEntityRepository(recordCount);
            _oDataRequestHelper.GetEdmModel(_httpContext.Request, _edmEntityTypeSettings, EdmNamespaceName);
        }
Ejemplo n.º 6
0
        public ODataContext(Func <IEnumerable <ConfigureODataConventionModelBuilder> > conventions)
        {
            var services = new ServiceCollection();

            services.AddMvcCore();
            services.AddOData();
            services.AddTransient <ODataUriResolver>();
            services.AddTransient <ODataQueryValidator>();
            services.AddTransient <TopQueryValidator>();
            services.AddTransient <FilterQueryValidator>();
            services.AddTransient <SkipQueryValidator>();
            services.AddTransient <OrderByQueryValidator>();
            services.AddTransient <CountQueryValidator>();
            services.AddTransient <SelectExpandQueryValidator>();
            services.AddTransient <SkipTokenQueryValidator>();

            Services = services.BuildServiceProvider();

            var routeBuilder = new RouteBuilder(new ApplicationBuilder(Services));

            routeBuilder
            .Count()
            .Expand()
            .Filter()
            .MaxTop(null)
            .OrderBy()
            .Select()
            .SkipToken();
            routeBuilder.EnableDependencyInjection();

            _model = new Lazy <IEdmModel>(() =>
            {
                var builder = new ODataConventionModelBuilder(Services);

                foreach (var convention in conventions())
                {
                    convention.Configure(builder);
                }

                return(builder.GetEdmModel());
            });
        }
Ejemplo n.º 7
0
        public static ServiceProvider GetServiceProvider()
        {
            var collection = new ServiceCollection();

            collection.AddOData();
            collection.AddODataQueryFilter();
            collection.AddTransient <ODataUriResolver>();
            collection.AddTransient <ODataQueryValidator>();
            collection.AddTransient <TopQueryValidator>();
            collection.AddTransient <FilterQueryValidator>();
            collection.AddTransient <SkipQueryValidator>();
            collection.AddTransient <OrderByQueryValidator>();

            var provider     = collection.BuildServiceProvider();
            var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == provider));

            routeBuilder.EnableDependencyInjection();

            return(provider);
        }