Web API 2.2 Kullanarak OData v4'te Singleton Oluşturma

Tarafından Zoe Luo

Geleneksel olarak, bir varlığa yalnızca bir varlık kümesi içinde kapsüllenmişse erişilebilirdi. Ancak OData v4, Her ikisi de WebAPI 2.2'nin desteklediği Singleton ve Containment adlı iki ek seçenek sağlar.

Bu makalede, Web API 2.2'de OData uç noktasında tekil tanımlama gösterilmektedir. Bir singleton'un ne olduğu ve bunu kullanmaktan nasıl yararlanabileceğiniz hakkında bilgi için bkz. Özel varlığınızı tanımlamak için tekil kullanma. Web API'sinde OData V4 uç noktası oluşturmak için bkz. ASP.NET Web API 2.2 Kullanarak OData v4 Uç Noktası Oluşturma.

Aşağıdaki veri modelini kullanarak Web API projenizde bir singleton oluşturacağız:

Veri Modeli

adlı Umbrella bir tekil türüne Companygöre tanımlanır ve adlı Employees bir varlık kümesi türüne Employeegöre tanımlanır.

Veri modelini tanımlama

  1. CLR türlerini tanımlayın.

    /// <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 türlerini temel alan EDM modelini oluşturun.

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

    Burada, builder.Singleton<Company>("Umbrella") model oluşturucusunun EDM modelinde adlı Umbrella bir singleton oluşturmasını söyler.

    Oluşturulan meta veriler aşağıdaki gibi görünür:

    <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>
    

    Meta verilerden varlık kümesindeki gezinti özelliğinin CompanyEmployees singleton Umbrellaöğesine bağlı olduğunu görebiliriz. Bağlama, yalnızca Umbrella türüne sahip Company olduğundan tarafından ODataConventionModelBuilderotomatik olarak gerçekleştirilir. Modelde herhangi bir belirsizlik varsa, bir gezinti özelliğini bir singleton'a açıkça bağlamak için kullanabilirsiniz HasSingletonBinding ; HasSingletonBinding CLR tür tanımında özniteliğini kullanmakla Singleton aynı etkiye sahiptir:

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

Tekil denetleyiciyi tanımlama

EntitySet denetleyicisinde olduğu gibi tekil denetleyici de 'den ODataControllerdevralır ve tekil denetleyici adı olmalıdır [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>()
        };
    } 
}

Farklı istek türlerini işlemek için, eylemlerin denetleyicide önceden tanımlanması gerekir. WebApi 2.2'de öznitelik yönlendirmesi varsayılan olarak etkindir. Örneğin, öznitelik yönlendirmesini kullanarak sorgulamayı RevenueCompany işlemek üzere bir eylem tanımlamak için aşağıdakileri kullanın:

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

Her eylem için öznitelikleri tanımlamak istemiyorsanız, OData Yönlendirme Kuralları'na göre eylemlerinizi tanımlamanız yeter. Tekil sorgulama için anahtar gerekli olmadığından, tekil denetleyicide tanımlanan eylemler varlık kümesi denetleyicisinde tanımlanan eylemlerden biraz farklıdır.

Başvuru için, singleton denetleyicisindeki her eylem tanımı için yöntem imzaları aşağıda listelenmiştir.

// 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()

Temel olarak, hizmet tarafında yapmanız gereken tek şey budur. Örnek proje, çözümün tüm kodunu ve singleton'un nasıl kullanılacağını gösteren OData istemcisini içerir. İstemci, OData v4 İstemci Uygulaması Oluşturma bölümündeki adımları izleyerek oluşturulur.

.

Bu makalenin orijinal içeriği için Leo Hu'ya teşekkür ederiz.