Vytvoření singletonu v OData v4 pomocí webového rozhraní API 2.2
autor: Zoe Luo
Tradičně bylo možné k entitě přistupovat pouze v případě, že byla zapouzdřena v sadě entit. OData v4 ale nabízí dvě další možnosti: Singleton a Containment, které webAPI 2.2 podporuje.
Tento článek ukazuje, jak definovat singleton v koncovém bodu OData ve webovém rozhraní API 2.2. Informace o tom, co je singleton a jak ho můžete využít, najdete v tématu Použití singletonu k definování speciální entity. Informace o vytvoření koncového bodu OData V4 ve webovém rozhraní API najdete v tématu Vytvoření koncového bodu OData v4 pomocí webového rozhraní API ASP.NET 2.2.
V projektu webového rozhraní API vytvoříme singleton s použitím následujícího datového modelu:
Jednoúčelový název Umbrella
bude definován na základě typu Company
a sada entit s názvem Employees
bude definována na základě typu Employee
.
Definování datového modelu
Definujte 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; } }
Vygenerujte model EDM na základě typů 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(); }
V této části řekne tvůrci modelů,
builder.Singleton<Company>("Umbrella")
aby v modelu EDM vytvořil jednoúčelový objekt s názvemUmbrella
.Vygenerovaná metadata budou vypadat takto:
<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 metadat vidíme, že vlastnost
Company
navigace vEmployees
sadě entit je vázána na jednoúčelovýUmbrella
objekt . Vazba se provádí automaticky pomocíODataConventionModelBuilder
, protože máCompany
pouzeUmbrella
typ. Pokud je v modelu nějaká nejednoznačnost, můžete použítHasSingletonBinding
k explicitní vazbě navigační vlastnosti na jednoúčelový objekt.HasSingletonBinding
Má stejný účinek jako použití atributuSingleton
v definici typu CLR:EntitySetConfiguration<Employee> employeesConfiguration = builder.EntitySet<Employee>("Employees"); employeesConfiguration.HasSingletonBinding(c => c.Company, "Umbrella");
Definování jednoúčelového kontroleru
Stejně jako kontroler EntitySet dědí jednoúčelový kontroler z ODataController
a název jednoúčelového kontroleru by měl být [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 bylo možné zpracovávat různé druhy požadavků, musí být akce v kontroleru předdefinované. Směrování atributů je ve webovém rozhraní WebApi 2.2 ve výchozím nastavení povolené. Pokud například chcete definovat akci pro zpracování dotazů Revenue
pomocí Company
směrování atributů, použijte následující:
[ODataRoute("Umbrella/Revenue")]
public IHttpActionResult GetCompanyRevenue()
{
return Ok(Umbrella.Revenue);
}
Pokud nechcete definovat atributy pro každou akci, stačí definovat akce podle konvencí směrování OData. Vzhledem k tomu, že pro dotazování typu singleton se klíč nevyžaduje, akce definované v jednoúčelovém kontroleru se mírně liší od akcí definovaných v kontroleru sady entit.
Pro referenci jsou níže uvedené signatury metod pro každou definici akce v jednoúčelovém kontroleru.
// 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()
V podstatě je to vše, co potřebujete udělat na straně služby. Ukázkový projekt obsahuje veškerý kód pro řešení a klienta OData, který ukazuje, jak používat singleton. Klient se sestaví podle kroků v tématu Vytvoření klientské aplikace OData v4.
.
Děkujeme Leo Hu za původní obsah tohoto článku.