Web API 2.2를 사용하여 OData v4에서 Singleton 만들기

작성자: Zoe Luo

일반적으로 엔터티는 엔터티 집합 내에 캡슐화된 경우에만 액세스할 수 있습니다. 그러나 OData v4는 WebAPI 2.2가 지원하는 두 가지 추가 옵션인 Singleton 및 Containment를 제공합니다.

이 문서에서는 Web API 2.2의 OData 엔드포인트에서 싱글톤을 정의하는 방법을 보여줍니다. 싱글톤이란 무엇이며 싱글톤을 사용하면 어떤 이점을 얻을 수 있는지에 대한 자세한 내용은 싱글톤을 사용하여 특수 엔터티 정의를 참조하세요. Web API에서 OData V4 엔드포인트를 만들려면 ASP.NET Web API 2.2를 사용하여 OData v4 엔드포인트 만들기를 참조하세요.

다음 데이터 모델을 사용하여 Web API 프로젝트에 싱글톤을 만듭니다.

데이터 모델

라는 Umbrella 싱글톤은 형식 Company에 따라 정의되고 라는 Employees 엔터티 집합은 형식 Employee에 따라 정의됩니다.

데이터 모델 정의

  1. CLR 형식을 정의합니다.

    /// <summary> 
    /// Present the EntityType "Employee" 
    /// </summary> 
    public class Employee 
    {     
        public int ID { get; set; }     
        public string Name { get; set; }  
       
        [Singleton]     
        public Company Company { get; set; } 
    } 
    /// <summary> 
    /// Present company category, which is an enum type 
    /// </summary> 
    public enum CompanyCategory 
    { 
        IT = 0,     
        Communication = 1,     
        Electronics = 2,     
        Others = 3 
    } 
    /// <summary> 
    /// Present the EntityType "Company" 
    /// </summary> 
    public class Company 
    {
         public int ID { get; set; }
         public string Name { get; set; }
         public Int64 Revenue { get; set; }
         public CompanyCategory Category { get; set; }
         public List<Employee> Employees { get; set; } 
    }
    
  2. CLR 형식을 기반으로 EDM 모델을 생성합니다.

    public static IEdmModel GetEdmModel() 
    { 
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Employee>("Employees"); builder.Singleton<Company>("Umbrella");
        builder.Namespace = typeof(Company).Namespace;
        return builder.GetEdmModel(); 
    }
    

    여기서 는 builder.Singleton<Company>("Umbrella") 모델 작성기에 EDM 모델에 라는 싱글 Umbrella 톤을 만들도록 지시합니다.

    생성된 메타데이터는 다음과 같습니다.

    <EntityContainer Name="Container"> 
      <EntitySet Name="Employees" EntityType="ODataSingletonSample.Employee"> 
        <NavigationPropertyBinding Path="Company" Target="Umbrella"/> 
      </EntitySet> 
      <Singleton Name="Umbrella" Type="ODataSingletonSample.Company"> 
        <NavigationPropertyBinding Path="Employees" Target="Employees"/> 
      </Singleton> 
    </EntityContainer>
    

    메타데이터에서 엔터티 집합의 탐색 속성 Company 이 싱글톤 UmbrellaEmployees 바인딩된 것을 볼 수 있습니다. 바인딩은 형식만 UmbrellaCompany 있으므로 에서 ODataConventionModelBuilder자동으로 수행됩니다. 모델에 모호성이 있는 경우 를 사용하여 HasSingletonBinding 탐색 속성을 싱글톤 HasSingletonBinding 에 명시적으로 바인딩할 수 있습니다. CLR 형식 정의에서 특성을 사용하는 Singleton 것과 동일한 효과가 있습니다.

    EntitySetConfiguration<Employee> employeesConfiguration = 
        builder.EntitySet<Employee>("Employees"); 
    employeesConfiguration.HasSingletonBinding(c => c.Company, "Umbrella");
    

싱글톤 컨트롤러 정의

EntitySet 컨트롤러와 마찬가지로 싱글톤 컨트롤러는 에서 ODataController상속되며 싱글톤 컨트롤러 이름은 이어야 [singletonName]Controller합니다.

public class UmbrellaController : ODataController 
{
    public static Company Umbrella;
    static UmbrellaController()
    {
        InitData();
    }
    private static void InitData()
    {
        Umbrella = new Company()
        {
            ID = 1,
            Name = "Umbrella",
            Revenue = 1000,
            Category = CompanyCategory.Communication,
            Employees = new List<Employee>()
        };
    } 
}

다양한 종류의 요청을 처리하려면 컨트롤러에서 작업을 미리 정의해야 합니다. 특성 라우팅 은 WebApi 2.2에서 기본적으로 사용하도록 설정됩니다. 예를 들어 특성 라우팅을 사용하여 쿼리를 RevenueCompany 처리하는 작업을 정의하려면 다음을 사용합니다.

[ODataRoute("Umbrella/Revenue")] 
public IHttpActionResult GetCompanyRevenue() 
{
     return Ok(Umbrella.Revenue); 
}

각 작업에 대한 특성을 정의하지 않으려는 경우 OData 라우팅 규칙에 따라 작업을 정의하기만 하면 됩니다. 싱글톤을 쿼리하는 데 키가 필요하지 않으므로 싱글톤 컨트롤러에 정의된 작업은 엔터티 세트 컨트롤러에 정의된 작업과 약간 다릅니다.

참조를 위해 싱글톤 컨트롤러의 모든 작업 정의에 대한 메서드 서명이 아래에 나열되어 있습니다.

// Get Singleton 
// ~/singleton 
public IHttpActionResult Get() 
public IHttpActionResult GetUmbrella() 

// Get Singleton 
// ~/singleton/cast 
public IHttpActionResult GetFromSubCompany() 
public IHttpActionResult GetUmbrellaFromSubCompany() 

// Get Singleton Property 
// ~/singleton/property  
public IHttpActionResult GetName() 
public IHttpActionResult GetNameFromCompany() 

// Get Singleton Navigation Property 
// ~/singleton/navigation  
public IHttpActionResult GetEmployees() 
public IHttpActionResult GetEmployeesFromCompany() 

// Update singleton by PUT 
// PUT ~/singleton 
public IHttpActionResult Put(Company newCompany) 
public IHttpActionResult PutUmbrella(Company newCompany) 

// Update singleton by Patch 
// PATCH ~/singleton 
public IHttpActionResult Patch(Delta<Company> item) 
public IHttpActionResult PatchUmbrella(Delta<Company> item) 

// Add navigation link to singleton 
// POST ~/singleton/navigation/$ref 
public IHttpActionResult CreateRef(string navigationProperty, [FromBody] Uri link) 

// Delete navigation link from singleton 
// DELETE ~/singleton/navigation/$ref?$id=~/relatedKey 
public IHttpActionResult DeleteRef(string relatedKey, string navigationProperty) 

// Add a new entity to singleton navigation property 
// POST ~/singleton/navigation 
public IHttpActionResult PostToEmployees([FromBody] Employee employee) 

// Call function bounded to singleton 
// GET ~/singleton/function() 
public IHttpActionResult GetEmployeesCount()

기본적으로 서비스 쪽에서 수행해야 하는 모든 작업입니다. 샘플 프로젝트에는 솔루션에 대한 모든 코드와 싱글톤을 사용하는 방법을 보여 주는 OData 클라이언트가 포함되어 있습니다. 클라이언트는 OData v4 클라이언트 앱 만들기의 단계에 따라 빌드됩니다.

.

이 문서의 원래 콘텐츠에 대한 레오 후 감사합니다.