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:
Singleton bernama Umbrella
akan didefinisikan berdasarkan jenis Company
, dan set entitas bernama Employees
akan ditentukan berdasarkan jenis Employee
.
Menentukan model data
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; } }
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 bernamaUmbrella
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 dalamEmployees
kumpulan entitas terikat ke singletonUmbrella
. Pengikatan dilakukan secara otomatis olehODataConventionModelBuilder
, karena hanyaUmbrella
memiliki jenis .Company
Jika ada ambiguitas dalam model, Anda dapat menggunakanHasSingletonBinding
untuk secara eksplisit mengikat properti navigasi ke singleton;HasSingletonBinding
memiliki efek yang sama seperti menggunakanSingleton
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk