Совместим ли UWP с CosmosDb?

У меня есть стандартная библиотека классов.net 2.0. Я использую интерфейс UWP с фреймворком призмы mvvm. Когда я пытаюсь получить доступ к cosmosdb в моей модели представления, клиент документа не возвращается. Есть ли проблема с совместимостью?

2 ответа

Решение

Основываясь на нашем существующем проекте, нет проблем с совместимостью.

Для ограничения политики я могу поделиться нашим кодом. Но я нашел третью ссылку для вашей справки:

https://www.c-sharpcorner.com/article/customized-azure-cosmos-db-with-xamarin-forms-application-student-detail-for-a/

Резюме для справки:

  1. Создание базы данных Azure Cosmos.

  2. Создайте приложение 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.

Другие вопросы по тегам