البرنامج التعليمي: تطوير تطبيق وحدة تحكم .NET باستخدام Azure Cosmos DB ل NoSQL
ينطبق على: NoSQL
يسمح لك Azure SDK ل .NET بإضافة بيانات إلى API لحاوية NoSQL إما عمليات فردية غير متزامنة أو دفعة معاملات. يستعرض هذا البرنامج التعليمي عملية إنشاء تطبيق وحدة تحكم .NET جديد يضيف عناصر متعددة إلى حاوية.
في هذا البرنامج التعليمي، تتعلم كيفية:
- إنشاء قاعدة بيانات باستخدام واجهة برمجة التطبيقات ل NoSQL
- إنشاء تطبيق وحدة تحكم .NET وإضافة Azure SDK ل .NET
- إضافة عناصر فردية إلى واجهة برمجة تطبيقات لحاوية NoSQL
- استرداد العناصر بكفاءة من واجهة برمجة التطبيقات لحاوية NoSQL
- إنشاء معاملة مع تغييرات دفعية لواجهة برمجة التطبيقات لحاوية NoSQL
المتطلبات الأساسية
- حساب Azure Cosmos DB ل NoSQL موجود.
- إذا كان لديك اشتراك Azure موجود، فبادر بإنشاء حساب جديد.
- لا يوجد اشتراك في Azure؟ يمكنك تجربة Azure Cosmos DB مجانا دون الحاجة إلى بطاقة ائتمان.
- Visual Studio Code
- .NET 8 أو أحدث
- خبرة في كتابة تطبيقات C#.
إنشاء واجهة برمجة تطبيقات لموارد NoSQL
أولا، قم بإنشاء قاعدة بيانات فارغة في واجهة برمجة التطبيقات الموجودة لحساب NoSQL. يمكنك إنشاء حاوية باستخدام Azure SDK ل .NET لاحقا.
انتقل إلى واجهة برمجة التطبيقات الموجودة لحساب NoSQL في مدخل Microsoft Azure.
في قائمة الموارد، حدد Keys.
في صفحة Keys، لاحظ وسجل قيمة حقلي URI و PRIMARY KEY. يتم استخدام هذه القيم خلال البرنامج التعليمي.
في قائمة الموارد، حدد Data Explorer.
في صفحة Data Explorer ، حدد الخيار New Database في شريط الأوامر.
في مربع الحوار قاعدة بيانات جديدة، أنشئ حاوية جديدة بالإعدادات التالية:
القيمة مُعرِّف قاعدة البيانات cosmicworks
نوع معدل نقل قاعدة البيانات يدوي مقدار معدل نقل قاعدة البيانات 400
حدد موافق لإنشاء قاعدة البيانات.
إنشاء تطبيق وحدة تحكم .NET
الآن، يمكنك إنشاء تطبيق وحدة تحكم .NET جديد واستيراد Azure SDK ل .NET باستخدام المكتبة Microsoft.Azure.Cosmos
من NuGet.
افتح محطة طرفية في دليل فارغ.
إنشاء تطبيق وحدة تحكم جديد باستخدام القالب
console
المضمنdotnet new console --langVersion preview
أضف إصدار 3.31.1-preview من الحزمة
Microsoft.Azure.Cosmos
من NuGet.dotnet add package Microsoft.Azure.Cosmos --version 3.31.1-preview
أضف أيضا إصدار ما قبل الإصدار من الحزمة
System.CommandLine
من NuGet.dotnet add package System.CommandLine --prerelease
أضف أيضا الحزمة
Humanizer
من NuGet.dotnet add package Humanizer
إنشاء مشروع تطبيق وحدة التحكم.
dotnet build
افتح Visual Studio Code باستخدام مجلد المشروع الحالي كمساحة عمل.
تلميح
يمكنك تشغيل
code .
في المحطة الطرفية لفتح Visual Studio Code وفتح دليل العمل تلقائيا كمساحة العمل الحالية.انتقل إلى ملف Program.cs وافتحه. حذف كافة التعليمات البرمجية الموجودة في الملف.
أضف هذه التعليمة البرمجية إلى الملف لاستخدام مكتبة System.CommandLine لتحليل سطر الأوامر لسلسلتين تم تمريرهما عبر الخيارين
--first
و--last
.using System.CommandLine; var command = new RootCommand(); var nameOption = new Option<string>("--name") { IsRequired = true }; var emailOption = new Option<string>("--email"); var stateOption = new Option<string>("--state") { IsRequired = true }; var countryOption = new Option<string>("--country") { IsRequired = true }; command.AddOption(nameOption); command.AddOption(emailOption); command.AddOption(stateOption); command.AddOption(countryOption); command.SetHandler( handle: CosmosHandler.ManageCustomerAsync, nameOption, emailOption, stateOption, countryOption ); await command.InvokeAsync(args);
إشعار
بالنسبة لهذا البرنامج التعليمي، ليس من المهم تماما أن تفهم كيفية عمل محلل سطر الأوامر. يحتوي المحلل على أربعة خيارات يمكن تحديدها عند تشغيل التطبيق. ثلاثة من الخيارات مطلوبة حيث سيتم استخدامها لإنشاء حقول المعرف ومفتاح القسم.
عند هذه النقطة، لن يتم بناء المشروع نظرا لأنك لم تحدد الأسلوب الثابت
CosmosHandler.ManageCustomerAsync
بعد.احفظ ملف Program.cs.
إضافة عناصر إلى حاوية باستخدام SDK
بعد ذلك، يمكنك استخدام عمليات فردية لإضافة عناصر إلى واجهة برمجة التطبيقات لحاوية NoSQL. في هذا القسم، يمكنك تعريف CosmosHandler.ManageCustomerAsync
الأسلوب .
إنشاء ملف CosmosHandler.cs جديد.
في ملف CosmosHandler.cs ، أضف توجيها جديدا باستخدام لمساحات
Humanizer
الأسماء وMicrosoft.Azure.Cosmos
.using Humanizer; using Microsoft.Azure.Cosmos;
إنشاء فئة ثابتة جديدة باسم
CosmosHandler
.public static class CosmosHandler { }
فقط للتحقق من صحة عمل هذا التطبيق، قم بإنشاء تنفيذ قصير للأسلوب الثابت
ManageCustomerAsync
لطباعة إدخال سطر الأوامر.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { await Console.Out.WriteLineAsync($"Hello {name} of {state}, {country}!"); }
احفظ ملف CosmosHandler.cs.
مرة أخرى في المحطة الطرفية، قم بتشغيل التطبيق.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
يجب أن يكون إخراج الأمر تحية ممتعة.
Hello Mica Pereira of Washington, United States!
ارجع إلى ملف CosmosHandler.cs .
ضمن فئة CosmosHandler الثابتة، أضف عضوا جديدا
private static readonly
من النوعCosmosClient
المسمى_client
.private static readonly CosmosClient _client;
إنشاء منشئ ثابت جديد للفئة
CosmosHandler
.static CosmosHandler() { }
ضمن الدالة الإنشائية، قم بإنشاء مثيل جديد للفئة
CosmosClient
التي تمر في معلمتين للسلسلة باستخدام قيم URI و PRIMARY KEY التي سجلتها مسبقا في المختبر. قم بتخزين هذا المثيل الجديد في_client
العضو.static CosmosHandler() { _client = new CosmosClient( accountEndpoint: "<uri>", authKeyOrResourceToken: "<primary-key>" ); }
مرة أخرى داخل فئة CosmosHandler الثابتة، قم بإنشاء أسلوب جديد غير متزامن يسمى
GetContainerAsync
الذي يقوم بإرجاعContainer
.private static async Task<Container> GetContainerAsync() { }
للخطوات التالية، أضف هذه التعليمة البرمجية
GetContainerAsync
داخل الأسلوب .احصل على
cosmicworks
قاعدة البيانات وقم بتخزينها في متغير يسمىdatabase
.Database database = _client.GetDatabase("cosmicworks");
إنشاء عام
List<>
جديد منstring
القيم ضمن قائمة مسارات مفتاح القسم الهرمي وتخزينها في متغير يسمىkeyPaths
.List<string> keyPaths = new() { "/address/country", "/address/state" };
إنشاء متغير جديد
ContainerProperties
باسم الحاوية (customers
) وقائمة مسارات مفتاح القسم.ContainerProperties properties = new( id: "customers", partitionKeyPaths: keyPaths );
CreateContainerIfNotExistsAsync
استخدم الأسلوب لتوفير خصائص الحاوية واسترداد الحاوية. سيقوم هذا الأسلوب، وفقا للاسم، بإنشاء الحاوية بشكل غير متزامن إذا لم تكن موجودة بالفعل داخل قاعدة البيانات. إرجاع النتيجة كإخراج الأسلوبGetContainerAsync
.return await database.CreateContainerIfNotExistsAsync( containerProperties: properties );
احذف كافة التعليمات البرمجية
ManageCustomerAsync
داخل الأسلوب .للخطوات التالية، أضف هذه التعليمة البرمجية
ManageCustomerAsync
داخل الأسلوب .استدعاء
GetContainerAsync
الأسلوب بشكل غير متزامن وتخزين النتيجة في متغير يسمىcontainer
.Container container = await GetContainerAsync();
إنشاء متغير جديد يسمى
id
يستخدم الأسلوب من Humanizer لتحويل معلمةname
الأسلوب.Kebaberize
string id = name.Kebaberize();
إشعار
Kebaberize
سيستبدل الأسلوب كافة المسافات بواصلات ويحيط النص بالأحرف الصغيرة.إنشاء عنصر جديد مكتوب مجهول باستخدام
name
state
معلمات الأسلوب و وcountry
والمتغيرid
. تخزين العنصر كمتغير يسمىcustomer
.var customer = new { id = id, name = name, address = new { state = state, country = country } };
استخدم أسلوب الحاوية غير المتزامن
CreateItemAsync
لإنشاء عنصر جديد في الحاوية وتعيين بيانات تعريف استجابة HTTP إلى متغير يسمىresponse
.var response = await container.CreateItemAsync(customer);
اكتب قيم
response
المتغيرStatusCode
وخصائصهRequestCharge
إلى وحدة التحكم. اكتب أيضا قيمةid
المتغير .Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
احفظ ملف CosmosHandler.cs.
مرة أخرى في المحطة الطرفية، قم بتشغيل التطبيق مرة أخرى.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
يجب أن يتضمن إخراج الأمر حالة وتكلفة طلب للعملية.
[Created] mica-pereira 7.05 RUs
إشعار
قد تختلف رسوم طلبك.
قم بتشغيل التطبيق مرة أخرى.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
هذه المرة، يجب أن يتعطل البرنامج. إذا قمت بالتمرير عبر رسالة الخطأ، فسترى حدوث العطل بسبب تعارض في المعرف الفريد للعناصر.
Unhandled exception: Microsoft.Azure.Cosmos.CosmosException : Response status code does not indicate success: Conflict (409);Reason: ( Errors : [ "Resource with specified id or name already exists." ] );
استرداد عنصر باستخدام SDK
الآن بعد أن قمت بإنشاء العنصر الأول في الحاوية، يمكنك استخدام نفس SDK لاسترداد العنصر. هنا، ستقوم بالاستعلام والإشارة إلى قراءة العنصر لمقارنة الفرق في استهلاك وحدة الطلب (RU).
ارجع إلى ملف CosmosHandler.cs أو افتحه.
احذف كافة أسطر التعليمات البرمجية
ManageCustomerAsync
من الأسلوب باستثناء السطرين الأولين.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
للخطوات التالية، أضف هذه التعليمة البرمجية
ManageCustomerAsync
داخل الأسلوب .استخدم أسلوب الحاوية غير المتزامن
CreateItemAsync
لإنشاء عنصر جديد في الحاوية وتعيين بيانات تعريف استجابة HTTP إلى متغير يسمىresponse
.var response = await container.CreateItemAsync(customer);
إنشاء سلسلة جديدة باسم
sql
مع استعلام SQL لاسترداد العناصر حيث يتطابق عامل التصفية (@id
).string sql = @" SELECT * FROM customers c WHERE c.id = @id ";
إنشاء متغير جديد
QueryDefinition
يسمىquery
تمرير فيsql
السلسلة كمعلمة الاستعلام الوحيدة. أيضا، استخدمWithParameter
الأسلوب السائل لتطبيق قيمة المتغيرid
على المعلمة@id
.var query = new QueryDefinition( query: sql ) .WithParameter("@id", id);
GetItemQueryIterator<>
استخدم الأسلوب العام والمتغيرquery
لإنشاء مكرر يحصل على البيانات من Azure Cosmos DB. تخزين المكرر في متغير يسمىfeed
. قم بتضمين هذا التعبير بأكمله في عبارة استخدام للتخلص من المكرر لاحقا.using var feed = container.GetItemQueryIterator<dynamic>( queryDefinition: query );
استدعاء
ReadNextAsync
أسلوبfeed
المتغير بشكل غير متزامن وتخزين النتيجة في متغير يسمىresponse
.var response = await feed.ReadNextAsync();
اكتب قيم
response
المتغيرStatusCode
وخصائصهRequestCharge
إلى وحدة التحكم. اكتب أيضا قيمةid
المتغير .Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
احفظ ملف CosmosHandler.cs.
مرة أخرى في المحطة الطرفية، قم بتشغيل التطبيق لقراءة العنصر الفردي باستخدام استعلام SQL.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
يجب أن يشير إخراج الأمر إلى أن الاستعلام يتطلب وحدات طلب متعددة (RUs).
[OK] mica-pereira 2.82 RUs
مرة أخرى في ملف CosmosHandler.cs ، احذف كافة أسطر التعليمات البرمجية
ManageCustomerAsync
من الأسلوب مرة أخرى باستثناء السطرين الأولين.public static async Task ManageCustomerAsync(string name, string email, string state, string country) { Container container = await GetContainerAsync(); string id = name.Kebaberize(); }
للخطوات التالية، أضف هذه التعليمة البرمجية
ManageCustomerAsync
داخل الأسلوب .إنشاء مثيل جديد من
PartitionKeyBuilder
عن طريق إضافةstate
المعلمات وcountry
كقيمة مفتاح قسم متعدد الأجزاء.var partitionKey = new PartitionKeyBuilder() .Add(country) .Add(state) .Build();
استخدم أسلوب الحاوية
ReadItemAsync<>
للإشارة إلى قراءة العنصر من الحاوية باستخدامid
المتغيرين وpartitionKey
. احفظ النتيجة في متغير يسمىresponse
.var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey );
اكتب قيم
response
المتغيرStatusCode
وخصائصهRequestCharge
إلى وحدة التحكم. اكتب أيضا قيمةid
المتغير .Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RU");
احفظ ملف CosmosHandler.cs مرة أخرى.
مرة أخرى في المحطة الطرفية، قم بتشغيل التطبيق مرة أخرى للإشارة إلى قراءة العنصر الفردي.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
يجب أن يشير إخراج الأمر إلى أن الاستعلام يتطلب وحدة طلب واحدة.
[OK] mica-pereira 1 RUs
إنشاء معاملة باستخدام SDK
وأخيرا، يمكنك أخذ العنصر الذي قمت بإنشائه، وقراءة هذا العنصر، وإنشاء عنصر مرتبط مختلف كجزء من معاملة واحدة باستخدام Azure SDK ل .NET.
ارجع إلى ملف CosmosHandler.cs أو افتحه.
احذف أسطر التعليمات البرمجية
ManageCustomerAsync
هذه من الأسلوب .var response = await container.ReadItemAsync<dynamic>( id: id, partitionKey: partitionKey ); Console.WriteLine($"[{response.StatusCode}]\t{id}\t{response.RequestCharge} RUs");
للخطوات التالية، أضف هذه التعليمة البرمجية
ManageCustomerAsync
الجديدة داخل الأسلوب .إنشاء عنصر جديد مكتوب مجهول باستخدام
name
state
معلمات الأسلوب و وcountry
والمتغيرid
. تخزين العنصر كمتغير يسمىcustomerCart
. يمثل هذا العنصر عربة تسوق في الوقت الحقيقي للعميل فارغة حاليا.var customerCart = new { id = $"{Guid.NewGuid()}", customerId = id, items = new string[] {}, address = new { state = state, country = country } };
إنشاء عنصر مجهول آخر مكتوب باستخدام
name
state
معلمات الأسلوب و وcountry
والمتغيرid
. تخزين العنصر كمتغير يسمىcustomerCart
. يمثل هذا العنصر معلومات الشحن والاتصال للعميل.var customerContactInfo = new { id = $"{id}-contact", customerId = id, email = email, location = $"{state}, {country}", address = new { state = state, country = country } };
إنشاء دفعة جديدة باستخدام أسلوب الحاوية
CreateTransactionalBatch
تمرير فيpartitionKey
المتغير. تخزين الدفعة في متغير يسمىbatch
. استخدم أساليب بطلاقة لتنفيذ الإجراءات التالية:الأسلوب المعلمة ReadItem
id
متغير السلسلةCreateItem
customerCart
متغير نوع مجهولCreateItem
customerContactInfo
متغير نوع مجهولvar batch = container.CreateTransactionalBatch(partitionKey) .ReadItem(id) .CreateItem(customerCart) .CreateItem(customerContactInfo);
استخدم أسلوب الدفعة
ExecuteAsync
لبدء المعاملة. احفظ النتيجة في متغير يسمىresponse
.using var response = await batch.ExecuteAsync();
اكتب قيم
response
المتغيرStatusCode
وخصائصهRequestCharge
إلى وحدة التحكم. اكتب أيضا قيمةid
المتغير .Console.WriteLine($"[{response.StatusCode}]\t{response.RequestCharge} RUs");
احفظ ملف CosmosHandler.cs مرة أخرى.
مرة أخرى في المحطة الطرفية، قم بتشغيل التطبيق مرة أخرى للإشارة إلى قراءة العنصر الفردي.
dotnet run -- --name 'Mica Pereira' --state 'Washington' --country 'United States'
يجب أن يظهر إخراج الأمر وحدات الطلب المستخدمة للمعاملة بأكملها.
[OK] 16.05 RUs
إشعار
قد تختلف رسوم طلبك.
التحقق من صحة البيانات النهائية في مستكشف البيانات
لإنهاء الأمور، يمكنك استخدام Data Explorer في مدخل Microsoft Azure لعرض البيانات والحاوية التي أنشأتها في هذا البرنامج التعليمي.
انتقل إلى واجهة برمجة التطبيقات الموجودة لحساب NoSQL في مدخل Microsoft Azure.
في قائمة الموارد، حدد Data Explorer.
في صفحة Data Explorer ، قم بتوسيع
cosmicworks
قاعدة البيانات، ثم حدد الحاويةcustomers
.في شريط الأوامر، حدد استعلام SQL جديد.
في محرر الاستعلام، لاحظ سلسلة استعلام SQL هذه.
SELECT * FROM c
حدد Execute Query لتشغيل الاستعلام ومراقبة النتائج.
يجب أن تتضمن النتائج صفيف JSON مع ثلاثة عناصر تم إنشاؤها في هذا البرنامج التعليمي. لاحظ أن جميع العناصر لها نفس قيمة مفتاح القسم الهرمي، ولكن حقول المعرف الفريدة. يتم اقتطاع مثال الإخراج المضمن للإيجاز.
[ { "id": "mica-pereira", "name": "Mica Pereira", "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "33d03318-6302-4559-b5c0-f3cc643b2f38", "customerId": "mica-pereira", "items": [], "address": { "state": "Washington", "country": "United States" }, ... }, { "id": "mica-pereira-contact", "customerId": "mica-pereira", "email": null, "location": "Washington, United States", "address": { "state": "Washington", "country": "United States" }, ... } ]
تنظيف الموارد
عند عدم الحاجة، احذف قاعدة البيانات المستخدمة في هذا البرنامج التعليمي. للقيام بذلك، انتقل إلى صفحة الحساب، وحدد مستكشف البيانات، وحدد cosmicworks
قاعدة البيانات، ثم حدد حذف.