Bagikan melalui


Membuat Singleton di OData v4 Menggunakan Web API 2.2

oleh Zoe Luo

Secara tradisional, entitas hanya dapat diakses jika dienkapsulasi di dalam set entitas. Tetapi OData v4 menyediakan dua opsi tambahan, Singleton dan Containment, yang keduanya didukung WebAPI 2.2.

Artikel ini memperlihatkan cara menentukan singleton di titik akhir OData di Web API 2.2. Untuk informasi tentang apa itu singleton dan bagaimana Anda dapat memperoleh manfaat dari penggunaannya, lihat Menggunakan singleton untuk menentukan entitas khusus Anda. Untuk membuat titik akhir OData V4 di API Web, lihat Membuat Titik Akhir OData v4 Menggunakan ASP.NET Web API 2.2.

Kami akan membuat singleton di proyek Web API Anda menggunakan model data berikut:

Data Model

Singleton bernama Umbrella akan didefinisikan berdasarkan jenis Company, dan set entitas bernama Employees akan ditentukan berdasarkan jenis Employee.

Menentukan model data

  1. Tentukan jenis 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. Hasilkan model EDM berdasarkan jenis CLR.

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

    Di sini, builder.Singleton<Company>("Umbrella") memberi tahu pembuat model untuk membuat singleton bernama Umbrella dalam model EDM.

    Metadata yang dihasilkan akan terlihat seperti berikut ini:

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

    Dari metadata kita dapat melihat bahwa properti Company navigasi dalam Employees kumpulan entitas terikat ke singleton Umbrella. Pengikatan dilakukan secara otomatis oleh ODataConventionModelBuilder, karena hanya Umbrella memiliki jenis .Company Jika ada ambiguitas dalam model, Anda dapat menggunakan HasSingletonBinding untuk secara eksplisit mengikat properti navigasi ke singleton; HasSingletonBinding memiliki efek yang sama seperti menggunakan Singleton atribut dalam definisi jenis CLR:

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

Menentukan pengontrol singleton

Seperti pengontrol EntitySet, pengontrol singleton mewarisi dari ODataController, dan nama pengontrol singleton harus [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>()
        };
    } 
}

Untuk menangani berbagai jenis permintaan, tindakan harus ditentukan sebelumnya di pengontrol. Perutean atribut diaktifkan secara default di WebApi 2.2. Misalnya, untuk menentukan tindakan untuk menangani kueri Revenue dari Company menggunakan perutean atribut, gunakan yang berikut ini:

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

Jika Anda tidak bersedia menentukan atribut untuk setiap tindakan, cukup tentukan tindakan Anda mengikuti Konvensi Perutean OData. Karena kunci tidak diperlukan untuk mengkueri singleton, tindakan yang ditentukan dalam pengontrol singleton sedikit berbeda dari tindakan yang ditentukan dalam pengontrol set entitas.

Sebagai referensi, tanda tangan metode untuk setiap definisi tindakan dalam pengontrol singleton tercantum di bawah ini.

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

Pada dasarnya, ini adalah semua yang perlu Anda lakukan di sisi layanan. Proyek sampel berisi semua kode untuk solusi dan klien OData yang menunjukkan cara menggunakan singleton. Klien dibangun dengan mengikuti langkah-langkah dalam Membuat Aplikasi Klien OData v4.

.

Terima kasih kepada Leo Hu untuk konten asli artikel ini.