private static void BuildContainer(IContainerBuilder container, ApplicationConfiguration appConfig, HttpConfiguration config) { container.AddService(ServiceLifetime.Singleton, sp => appConfig); container.AddService <ODataUriResolver>(ServiceLifetime.Singleton, sp => new UnqualifiedODataUriResolver()); container.AddService(ServiceLifetime.Singleton, sp => { var conventions = ODataRoutingConventions.CreateDefaultWithAttributeRouting("odata", config); conventions.Insert(0, new UnboundFunctionsConvention()); //conventions.Insert(0, new AnyNavigationRoutingConvension()); conventions.Insert(0, new SingleEntityRoutingConvention()); return(conventions.AsEnumerable()); }); var controllers = appConfig.ConfigureModel.Method.DeclaringType.Assembly.ExportedTypes .Where(t => !t.IsAbstract) .Where(typeof(ODataController).IsAssignableFrom).ToList(); container.AddService <MetadataController>(ServiceLifetime.Transient); container.AddService <ExtendedMetadataController>(ServiceLifetime.Transient); container.AddService <FilterBinder, ExtendedFilterBinder>(ServiceLifetime.Singleton); ExtendedFilterBinder.RegisterCustomFunctions(); var builder = new ODataConventionModelBuilder(); builder.Namespace = typeof(Service).Namespace; builder.EnableLowerCamelCase(); builder.ContainerName = "DefaultContainer"; var entitySetFactory = builder.GetType().GetMethod("EntitySet"); foreach (var controller in controllers) { container.AddService(ServiceLifetime.Transient, controller); var modelType = GetControllerBaseModel(controller); if (modelType != null) { var setName = controller.Name.Replace("Controller", ""); entitySetFactory.MakeGenericMethod(modelType).Invoke(builder, new object[] { setName }); } } builder.Function(Constants.ValidationFunctionName).Returns <ValidationEntityDocument>(); //builder.Function(Constants.GenerateFunctionName).Returns<IHttpActionResult>(); appConfig.ConfigureModel(builder); appConfig.Register(container); var model = builder.GetEdmModel(); container.AddService(ServiceLifetime.Singleton, sp => model); }