티스토리 뷰

반응형

Visual Studio 2013에서 ApiController를 이용해서 OData Query를 사용하는 방법에 대해 포스팅한다.

 

참고 포스트

Supporting OData Query Options

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

 

이 포스트의 핵심은 기존 ApiController를 이용해서도 OData쿼리를 할 수 있다는 내용이다.(사실 이것이 정상이지..처음에는 되었다가 나중에 않되었다가 다시 풀어준..그런 기가막힌 사연을 가지고 있다)

 

PCLSample.WebAPI 프로젝트를 추가했다.

기본 프로젝트는 이전 포스트 처럼 Empty템플릿과 WebAPI만을 선택해서 만든 후 추가적인 Nuget packages를 추가한다.

 

* Nuget packages : 필수 항목만 나열한다.

EntityFramework : Database 연동을 하기 위한 프레임웍

Microsoft ASP.NET Web API OData : OData Query를 사용하기 위한 필수 항목

Portable IoC : IoC를 사용하기 위한 패키지

그외 나머지 내용들은 위의 내용 설치시 함께 설치가 되거나, PCL에서 사용하는 패키지들이라 함께 설치한 것이다.

 

위의 패키지들을 설치한 후

 

WebApiConfig.cs

 

        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.EnableQuerySupport();        //OData Query 사용 가능 옵션 활성화
        }

 

PeopleController.cs

 

    public class PeopleController : ApiController
    {
        private IUnitOfWork _uow;

        public PeopleController()
        {
            _uow = GlobalVariables.Container.Resolve<IUnitOfWork>();
        }

        /// <summary>
        /// 조회
        /// </summary>
        /// <returns></returns>
        [Queryable]
        public IQueryable<PersonModel> Get()
        {
            return _uow.PeopleRepo.AllGetting();
        }
    }

GlobalVariables.cs

전역에서 사용할 스택틱 클래스 선언

    public static class GlobalVariables
    {
        private static IPortableIoC _container;
        /// <summary>
        /// PortableIoC Conatiner
        /// </summary>
        public static IPortableIoC Container
        {
            get { return _container = _container ?? new PortableIoc(); }
            private set { _container = value; }
        }
    }

 

Global.asax

ApiController에서 사용할 인터페이스를 등록하고, 데이터 베이스 초기화할때 실행할 내용을 지정한다.

 

        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            //Regiser user interface
            GlobalVariables.Container.Register<IUnitOfWork>(ioc => new UnitOfWork());

            //db init
            System.Data.Entity.Database.SetInitializer(new PCLSampleContextInitializer());
        }

 

Web.config

Database연결 문자열은 자신의 환경에 맞게 수정한다.

...

  <connectionStrings>
    <add name="PCLSampleContext" connectionString="Data Source=(local)\sqlexpress;Initial Catalog=PCLSample;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
  </connectionStrings>
...

 

F5로 실행

웹 페이지가 없기 때문에 별 내용은 나오지 않는다.

 

주소창에 http://localhost:59409/api/People 입력

결과 (서비스가 시작되면서 db가 생성되었을때 Seed가 입력되어 있음)

[{"Id":1,"Age":20,"Name":"kaki104","Sex":true}

,{"Id":2,"Age":21,"Name":"kaki105","Sex":false}

,{"Id":3,"Age":22,"Name":"kaki106","Sex":true}

,{"Id":4,"Age":23,"Name":"kaki107","Sex":false}

,{"Id":5,"Age":24,"Name":"kaki108","Sex":true}]

 

http://localhost:59409/api/People?$filter=Name eq 'kaki105'

결과

[{"Id":2,"Age":21,"Name":"kaki105","Sex":false}]

 

http://localhost:59409/api/People?$skip=2&$top=2

결과

[{"Id":3,"Age":22,"Name":"kaki106","Sex":true},{"Id":4,"Age":23,"Name":"kaki107","Sex":false}]

 

쿼리 옵션이나 추가 기능은 참고 포스트를 보면 나와있다

 

ODataController인 경우에는 기본적으로 OData Query를 사용할 수 있다.

 

전체 소스

http://sdrv.ms/Ii8hLb

 

 

반응형
댓글