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:
adlı Umbrella
bir tekil türüne Company
göre tanımlanır ve adlı Employees
bir varlık kümesi türüne Employee
göre tanımlanır.
Veri modelini tanımlama
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; } }
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
Company
Employees
singletonUmbrella
öğesine bağlı olduğunu görebiliriz. Bağlama, yalnızcaUmbrella
türüne sahipCompany
olduğundan tarafındanODataConventionModelBuilder
otomatik olarak gerçekleştirilir. Modelde herhangi bir belirsizlik varsa, bir gezinti özelliğini bir singleton'a açıkça bağlamak için kullanabilirsinizHasSingletonBinding
;HasSingletonBinding
CLR tür tanımında özniteliğini kullanmaklaSingleton
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 ODataController
devralı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ı Revenue
Company
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.