Tworzenie pojedynczego elementu w usłudze OData w wersji 4 przy użyciu internetowego interfejsu API 2.2

Autor: Zoe Luo

Tradycyjnie można uzyskać dostęp do jednostki tylko wtedy, gdy została ona hermetyzowana wewnątrz zestawu jednostek. Jednak protokół OData w wersji 4 udostępnia dwie dodatkowe opcje: Singleton i Containment, z których obie są obsługiwane przez interfejs WebAPI 2.2.

W tym artykule pokazano, jak zdefiniować jedenton w punkcie końcowym OData w internetowym interfejsie API 2.2. Aby uzyskać informacje o tym, co jest pojedynczy i jak można z niego korzystać, zobacz Używanie pojedynczej jednostki do definiowania jednostki specjalnej. Aby utworzyć punkt końcowy OData V4 w internetowym interfejsie API, zobacz Create an OData v4 Endpoint Using ASP.NET Web API 2.2 (Tworzenie punktu końcowego OData w wersji 4 przy użyciu ASP.NET internetowego interfejsu API 2.2).

Utworzymy pojedynczy obiekt w projekcie internetowego interfejsu API przy użyciu następującego modelu danych:

Model danych

Pojedyncza nazwana nazwana Umbrella zostanie zdefiniowana na podstawie typu Company, a zestaw jednostek o nazwie Employees zostanie zdefiniowany na podstawie typu Employee.

Zdefiniowanie modelu danych

  1. Zdefiniuj typy 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. Wygeneruj model EDM na podstawie typów 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(); 
    }
    

    W tym miejscu informuje konstruktora modeli o builder.Singleton<Company>("Umbrella") utworzeniu pojedynczego typu o nazwie Umbrella w modelu EDM.

    Wygenerowane metadane będą wyglądać następująco:

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

    Z metadanych widać, że właściwość Company nawigacji w Employees zestawie jednostek jest powiązana z singletonem Umbrella. Powiązanie jest wykonywane automatycznie przez metodę ODataConventionModelBuilderCompany , ponieważ ma tylko Umbrella typ. Jeśli w modelu istnieje dowolna niejednoznaczność, możesz użyć HasSingletonBinding polecenia , aby jawnie powiązać właściwość nawigacji z pojedynczą wartością; HasSingletonBinding ma taki sam efekt jak użycie atrybutu Singleton w definicji typu CLR:

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

Definiowanie pojedynczego kontrolera

Podobnie jak kontroler EntitySet, kontroler pojedynczegotonu dziedziczy z ODataControllerklasy , a nazwa pojedynczego kontrolera powinna mieć wartość [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>()
        };
    } 
}

Aby obsługiwać różne rodzaje żądań, akcje muszą być wstępnie zdefiniowane w kontrolerze. Routing atrybutów jest domyślnie włączony w interfejsie WebApi 2.2. Aby na przykład zdefiniować akcję do obsługi zapytań Revenue przy Company użyciu routingu atrybutów, użyj następującego polecenia:

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

Jeśli nie chcesz definiować atrybutów dla każdej akcji, zdefiniuj akcje zgodnie z konwencjami routingu OData. Ponieważ klucz nie jest wymagany do wykonywania zapytań względem pojedynczego, akcje zdefiniowane w kontrolerze pojedynczegotonu różnią się nieco od akcji zdefiniowanych w kontrolerze zestawu jednostek.

W przypadku odwołań podpisy metody dla każdej definicji akcji w kontrolerze pojedynczegotonu są wymienione poniżej.

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

Zasadniczo jest to wszystko, co musisz zrobić po stronie usługi. Przykładowy projekt zawiera cały kod rozwiązania i klienta OData, który pokazuje, jak używać pojedynczego elementu. Klient jest kompilowany, wykonując kroki opisane w temacie Tworzenie aplikacji klienckiej OData w wersji 4.

.

Dzięki Leo Hu za oryginalną zawartość tego artykułu.