Совместим ли UWP с CosmosDb?
У меня есть стандартная библиотека классов.net 2.0. Я использую интерфейс UWP с фреймворком призмы mvvm. Когда я пытаюсь получить доступ к cosmosdb в моей модели представления, клиент документа не возвращается. Есть ли проблема с совместимостью?
2 ответа
Основываясь на нашем существующем проекте, нет проблем с совместимостью.
Для ограничения политики я могу поделиться нашим кодом. Но я нашел третью ссылку для вашей справки:
Резюме для справки:
Создание базы данных Azure Cosmos.
Создайте приложение Xamarin.Forms: откройте Visual Studio 2017 -> Пуск -> Новый проект-> Выбрать кросс-платформенный (в Visual C#-> Кросс-платформенный -> Мобильное приложение (Xamarin.Forms)-> Дайте подходящее имя для вашего приложения (XamFormStudCos) -> ОК.
Выберите кросс-платформенный шаблон как "Пустое приложение" -> "Установить платформу как Android, iOS и UWP" и стратегию совместного использования кода как "Общий проект".
Добавьте справочник Microsoft.Azure.DocumentDB.Core.
Добавьте класс Connection.cs для учетной записи xamstudcosmos (CosmosDB):
using Newtonsoft.Json; public class Connection { public static readonly string EndpointUri = "https://xamstudcosmos.documents.azure.com:443/"; public static readonly string PrimaryKey = "r03kRnNeyU3Bij7b9TZgsrkoKoU2ERdWM2d2jMAaaKWFClSJobyC8SyXmeazwKEwm8c2UhEjCNDU9NhI4grEFQ=="; public static readonly string DatabaseName = "StudentDB"; public static readonly string CollectionName = "Student"; }
Используя MVC, сначала создайте папку модели и добавьте класс StudentDetail для модели данных:
public class StudentDetail { [JsonProperty(PropertyName = "id")] public string Id { get; set; } [JsonProperty(PropertyName = "name")] public string Name { get; set; } [JsonProperty(PropertyName = "Age")] public string Age { get; set; } }
Создайте папку контроллера и добавьте интерфейс IDocumentDBService для DocumentDB:
using System.Threading.Tasks; using XamFormStudCos.Model; public interface IDocumentDBService { Task CreateDatabaseAsync(string databaseName); Task CreateDocumentCollectionAsync(string databaseName, string collectionName); Task < List < StudentDetail >> GetStoreInfoAsync(); Task SaveStudentDetailAsync(StudentDetail stud, bool isNewstudent); Task DeleteStudentAsync(string id); }
Добавьте класс DocumentDBService для реализации интерфейса IDocumentDBService.
using System.Threading.Tasks; using XamFormStudCos.Model; using Microsoft.Azure.Documents; using Microsoft.Azure.Documents.Client; using Microsoft.Azure.Documents.Linq; using System.Diagnostics; class DocumentDBService: IDocumentDBService { public List < StudentDetail > Items { get; private set; } DocumentClient client; Uri collectionLink; public DocumentDBService() { client = new DocumentClient(new Uri(Connection.EndpointUri), Connection.PrimaryKey); collectionLink = UriFactory.CreateDocumentCollectionUri(Connection.DatabaseName,
Connection.CollectionName); } публичная асинхронная задача CreateDatabaseAsync (строка databaseName) {
пытаться {
await client.CreateDatabaseIfNotExistsAsync (новая база данных {
Id = databaseName
});
} catch (DocumentClientException ex) {
Debug.WriteLine ("Ошибка:", ex.Message);
}} публичная асинхронная задача CreateDocumentCollectionAsync (строка databaseName, строка collectionName) {
пытаться {
ожидание client.CreateDocumentCollectionIfNotExistsAsync (UriFactory.CreateDatabaseUri (Connection.DatabaseName), new DocumentCollection {
Id = collectionName
}, новые RequestOptions {
OfferThroughput = 400
});
} catch (DocumentClientException ex) {
Debug.WriteLine ("Ошибка:", ex.Message);
}} публичная асинхронная задача DeleteStudentAsync (идентификатор строки) {
пытаться {
ожидание client.DeleteDocumentAsync (UriFactory.CreateDocumentUri (Connection.DatabaseName, Connection.CollectionName, id));} catch (DocumentClientException ex) { Debug.WriteLine("Error: ", ex.Message); } } async Task DeleteDocumentCollection() { try { await client.DeleteDocumentCollectionAsync(collectionLink); } catch (DocumentClientException ex) { Debug.WriteLine("Error: ", ex.Message); } } async Task DeleteDatabase() { try { await client.DeleteDatabaseAsync(UriFactory.CreateDatabaseUri(Connection.DatabaseName)); } catch (DocumentClientException ex) { Debug.WriteLine("Error: ", ex.Message); } } public async Task < List < StudentDetail >> GetStudentAsync() { Items = new List < StudentDetail > (); try { var query = client.CreateDocumentQuery < StudentDetail > (collectionLink).AsDocumentQuery(); while (query.HasMoreResults) { Items.AddRange(await query.ExecuteNextAsync < StudentDetail > ()); } } catch (DocumentClientException ex) { Debug.WriteLine("Error: ", ex.Message); } return Items; } public async Task SaveStudentDetailAsync(StudentDetail student, bool isNewItem) { try { if (isNewItem) { await client.CreateDocumentAsync(collectionLink, student); } else { await client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(Connection.DatabaseName,
Connection.CollectionName, student.Id), student);
}
} catch (DocumentClientException ex) {
Debug.WriteLine ("Ошибка:", ex.Message);
}
}
} Добавьте класс StudentDetailManager.using System.Threading.Tasks; using XamFormStudCos.Model; using XamFormStudCos.Controller; public class StudentDetailManager { IDocumentDBService documentDBService; public StudentDetailManager(IDocumentDBService service) { documentDBService = service; } public Task CreateDatabase(string databaseName) { return documentDBService.CreateDatabaseAsync(databaseName); } public Task CreateDocumentCollection(string databaseName, string collectionName) { return documentDBService.CreateDocumentCollectionAsync(databaseName,
CollectionName);
}
public Task> GetStoreInfoAsync () {
return documentDBService.GetStoreInfoAsync ();
}
public Task SaveStudentDetailAsync (StudentDetail student, bool isNewItem = false) {
return documentDBService.SaveStudentDetailAsync (student, isNewItem);
}
public Task DeleteStudentAsync (StudentDetail student) {
return documentDBService.DeleteStudentAsync (student.Id);
}
}
Добавьте следующие пространства имен и код в App.xaml.cs.using XamFormStudCos.Controller; using XamFormStudCos.View; public static StudentDetailManager StudentDetailManager { get; private set; } public App() { InitializeComponent(); StudentDetailManager = new StudentDetailManager(new DocumentDBService()); MainPage = new NavigationPage(new StudentList()); }
Затем создайте папку просмотра и добавьте страницу Xaml StudentList для просмотра всех списков учащихся. Добавить элемент панели инструментов с помощью элемента "Добавить" и "ListView" для просмотра списка учащихся.
<ContentPage.ToolbarItems> <ToolbarItem Text="Add" Order="Primary" Clicked="OnItemAdded" /> </ContentPage.ToolbarItems> <ListView x:Name="SList" ItemSelected="OnItemselected"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding Name}" Detail="{Binding Age}" /> </DataTemplate> </ListView.ItemTemplate> </ListView>
Добавьте следующие пространства имен и код в StudentList.xaml.cs
using XamFormStudCos.Model; protected override async void OnAppearing() { base.OnAppearing(); await App.StudentDetailManager.CreateDatabase(Constants.DatabaseName); await App.StudentDetailManager.CreateDocumentCollection(Constants.DatabaseName,
Constants.CollectionName);
var data = await App.StudentDetailManager.GetStoreInfoAsync ();
StdList.ItemsSource = data;
}
async void OnItemAdded (отправитель объекта, EventArgs e) {
await Navigation.PushAsync (new StudentDetails (true) {
BindingContext = new StudentDetail {
Id = Guid.NewGuid (). ToString ()
}
});
}
async void OnItemselected (отправитель объекта, SelectedItemChangedEventArgs e) {
if (e.SelectedItem! = null) {
await Navigation.PushAsync (new EditStudent() {
BindingContext = e.SelectedItem as StudentDetail
});
}
}Добавьте страницу Xaml StudentDetails для добавления новой информации о студентах.
Для добавления нового студента, добавьте элементы управления Label, Entry и Button с помощью метода события click.
<ContentPage.Content> <StackLayout Margin="20" VerticalOptions="StartAndExpand"> <Label Text="Name" /> <Entry Text="{Binding Path=Name}" Placeholder="Enter Student Name" /> <Label Text="Age" /> <Entry Text="{Binding Path=Age}" /> <Button Text="Save" Clicked="OnSaveClicked" /> <Button Text="Cancel" Clicked="OnCancelClicked" /> </StackLayout> </ContentPage.Content>
Добавьте следующие пространства имен и код в StudentDetail.xaml.cs
using XamFormStudCos.Model; bool isNewItem; public StudentDetails(bool isNew) { InitializeComponent(); isNewItem = isNew; } async void OnSaveClicked(object sender, EventArgs e) { var student = (StudentDetail) BindingContext; await App.StudentDetailManager.SaveStudentDetailAsync(student, isNewItem); await Navigation.PopAsync(); } async void OnCancelClicked(object sender, EventArgs e) { await Navigation.PopAsync(); }
Добавьте страницу EditStudent Xaml для детализации EditStudent(Обновить, Удалить).
Для редактирования учащегося добавьте элементы управления Label, Entry и Button с помощью метода события click,
<StackLayout Padding="10" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> <Grid> <Label Text="Name" Grid.Row="0" Grid.Column="0" HorizontalOptions="Start" WidthRequest="100" VerticalOptions="Center"
/>
<Button Text="Cancel" HorizontalOptions="FillAndExpand" BackgroundColor="Blue" TextColor="White" Clicked="OnCancelClicked" />
Добавьте следующие пространства имен и код в EditStudent.xaml.cs
using XamFormStudCos.Model; async void Update_Clicked(object sender, System.EventArgs e) { var student = (StudentDetail) BindingContext; await App.StudentDetailManager.SaveStudentDetailAsync(student); await Navigation.PopAsync(); } async void OnDeleteClicked(object sender, EventArgs e) { bool accepted = await DisplayAlert("Confirm", "Are you Sure ?", "Yes", "No"); if (accepted) { var student = (StudentDetail) BindingContext; await App.StudentDetailManager.DeleteStudentAsync(student); await Navigation.PopAsync(); } } async void OnCancelClicked(object sender, EventArgs e) { await Navigation.PopAsync(); }
Построить и развернуть.
Вам нужно проверить свою конфигурацию или другую логику кода.
Служба поддержки Майкрософт сообщила, что Cosmos DB не будет работать (и никогда не работал) на UWP в режиме выпуска (и исправить это — низкий приоритет). Я предполагаю, что этот пример запускался только в режиме отладки. Я хотел бы знать обходной путь. Я пробовал как V2 SDK, так и V3 SDK. Для воспроизведения не требуется ничего столь же сложного, как этот пример. Просто начните с пустого шаблона приложения UWP и попробуйте запросить Cosmos.