Web API 2,2 kullanarak tek bir OData v4 oluşturma

Zoe Luo tarafından

Geleneksel olarak, bir varlığa yalnızca bir varlık kümesi içinde kapsülleniyorsa erişilebilir. Ancak OData v4, her ikisi de hem WebAPI 2,2 ' nin desteklediği iki ek seçenek sunar.

Bu makalede, Web API 2,2 ' de bir OData uç noktasında tekil nasıl tanımlanacağı gösterilmektedir. Tekil nedir ve bunu kullanmanın avantajlarından faydalanmanız hakkında bilgi edinmek için, bkz. özel varlığınızı tanımlamak için tek tek kullanma. Web API 'de OData v4 uç noktası oluşturmak için, bkz. ASP.NET Web apı 2,2 kullanarak OData v4 uç noktası oluşturma.

Aşağıdaki veri modelini kullanarak Web API projenizde tek bir oluşturacak:

Veri Modeli

Tek bir adlandırılmış Umbrella Companytürüne göre tanımlanır ve Employees adlı bir varlık kümesi Employeetürüne göre tanımlanır.

Bu öğreticide kullanılan çözüm CodePlex'ten indirilebilir.

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şturucunun EDM modelinde tek bir adlandırılmış Umbrella 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, Employees varlık kümesindeki Gezinti özelliğinin Company Singleton Umbrellabağlandığını görebiliriz. Yalnızca Umbrella Company türüne sahip olduğundan bağlama ODataConventionModelBuildertarafından otomatik olarak gerçekleştirilir. Modelde belirsizlik varsa, bir gezinti özelliğini açıkça tek bir şekilde bağlamak için HasSingletonBinding kullanabilirsiniz. HasSingletonBinding, CLR tür tanımında Singleton özniteliği ile aynı etkiye sahiptir:

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

Tek denetleyiciyi tanımlama

EntitySet denetleyicisi gibi, tek denetleyici ODataControllerdevralır ve tek denetleyici adı [singletonName]Controllerolmalıdır.

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, denetleyicide önceden tanımlanmış olması gerekir. Varsayılan olarak, WebApi 2,2 ' de öznitelik yönlendirme etkindir. Örneğin, öznitelik yönlendirme kullanarak Company Revenue sorgulamayı işlemeye yönelik bir eylem tanımlamak için aşağıdakileri kullanın:

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

Her bir eylem için öznitelikleri tanımlamanızı istemiyorsanız, yalnızca, OData yönlendirme kurallarınıizleyen eylemlerinizi tanımlamanız yeterlidir. Tek bir sorgulama için anahtar gerekli olmadığından, tek denetleyicide tanımlanan eylemler, EntitySet denetleyicisinde tanımlanan eylemlerden biraz farklıdır.

Başvuru için, tek denetleyicideki 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 ve tek tek 'nın nasıl kullanılacağını gösteren OData istemcisinin tüm kodlarını içerir. İstemci, OData v4 Istemci uygulaması oluşturmabölümündeki adımları izleyerek oluşturulur.

arasında yetersiz alanla karşılaştı.

Bu makalenin özgün içeriği için yem hu için teşekkürler.