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:
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
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; } }
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 nazwieUmbrella
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 wEmployees
zestawie jednostek jest powiązana z singletonemUmbrella
. Powiązanie jest wykonywane automatycznie przez metodęODataConventionModelBuilder
Company
, ponieważ ma tylkoUmbrella
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 atrybutuSingleton
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 ODataController
klasy , 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.