2016-03-30 9 views
1

Ich baue ein Projekt, das eine MVC Web Api enthält, die in Azure und einer iOS App gehostet wird. Ich versuche Xamarin zu verwenden, um die App zu erstellen. Nach meinem Verständnis sollte ich in meinem Xamarin-Projekt eine portable Klassenbibliothek verwenden, um den Code zwischen meinem Web-API-Projekt und der Xamarin-App sowie zukünftige Apps auf anderen Plattformen wie Android zu teilen.Xamarin portable library - Wie teile ich Klassen?

Also von Anfang an würde ich meine Modelle in die tragbare Bibliothek legen wollen. Die App und die Web-API geben diese Modelle hin und her. Die tragbare Bibliothek verfügt jedoch nicht über die Azure Table Storage-Bibliothek. Es hat nicht einmal ein paar grundlegende Dinge. Meine Modelle müssen auf die Azure-Speicherbibliothek verweisen, damit ich Instanzen im Speicher speichern kann.

Was ist der beste Weg, um diesen Code gemeinsam nutzbar zu machen? Natürlich muss ich meine Modellklassen duplizieren, damit sie an jedem Ort existieren können. Aber sollten diejenigen in der PCL von denen im Web-API-Projekt erben? Und umgekehrt? Sollte es eine Schnittstelle geben, von der beide erben (tatsächlich erfordert die Azure Table Storage-Bibliothek, dass die Klassen bereits von ITableEntity erben ...). Ich suche nur nach dem besten Weg, diese Klassen zwischen dem Web-API-Projekt und dem PCL des Xamarin-Projekts zu teilen.

Antwort

3

Die Verwendung einer PCL - Portable Class Library ist ein guter Einstieg! Es gibt ein paar Macken, die Sie vielleicht vor dem Teilen Ihres Codes verstehen möchten.

  • Das PCL-Profil ist eine begrenzte Anzahl von verfügbaren APIs. Das bedeutet, dass bestimmte Klassen/Assemblies möglicherweise nicht enthalten sind. Sie können die Klasse/Assembly normalerweise über MSDN nachsehen und sehen, ob neben dem Klassennamen ein PCL-Symbol angezeigt wird.
  • Wenn die Bibliothek, die Sie verwenden möchten, Assemblys enthält, die sich nicht im aktuellen PCL-Profil befinden, aber auf den nativen Plattformen gefunden werden können, sollten Sie das IoC/DI-Muster verwenden.

  • Hoffentlich unterstützt die Bibliothek, die Sie verwenden, PCL. Andernfalls benötigen Sie eine Bibliothek, die das PCL-Profil unterstützt. (Sie können dies überprüfen, indem Sie die .nupkg herunterladen, extrahieren und den Ordner libs ansehen). Hinweis: Sie können den NuGet-Kanal Prerelease für die PCL-Unterstützung überprüfen. Manchmal können Sie ein Open-Source-Projekt finden und bestimmte Baugruppen/Codes entfernen/ersetzen, um es zu Portable zu machen.

Allgemeine Richtlinien:

  • Halten Sie Ihre POCO Klassen einfach in der PCL. Wenn Sie plattformspezifische Eigenarten haben, die Sie zu den Modellen hinzufügen müssen, erstellen Sie eine Modellschicht auf dieser Plattform, die von Ihren einfachen PCL-Modellen erbt. EX: Ihre Web-API verfügt über einen spezifischen Tag oder eine Schnittstelle [Attribute], die Sie auf Ihr Modell anwenden müssen. Möglicherweise haben Sie bereits ein Modell wie Person, das eine einfache POCO-Klasse in Ihrem PCL ist, und dann können Sie ein PersonApiEntity-Modell erstellen, das Person und alle plattformspezifischen APIs übernehmen kann, die Sie darauf anwenden müssen.

  • Es scheint ITableEntity/TableEntity wird nicht im PCL-Profil unterstützt.

https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.itableentity.aspx

bei einem schnellen Blick die Quelle sehen (https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Table/ITableEntity.cs)

+0

Dank Jon! Das musste ich wissen. Ich lege POCOs in den PCL und erben von ihnen im Web-API-Projekt. –

+0

Jon, ein kleiner Haken - meine Klassen im Web-API-Projekt müssen von Microsoft.WindowsAzure.Storage.Table.TableEntity erben. Das heißt, sie können auch nicht von meinen POCOs in der PCL erben. Was ist der beste Ansatz in einer solchen Situation? Würden Sie eine Reihe von intermediären Klassen erstellen, die von den POCOs erben, und dann Ihre Web-API-Klassen von diesen intermediären Klassen ableiten? Das scheint chaotisch, aber ich habe keine besseren Ideen ... –

+0

Sieht aus wie die Antwort von @MikeWo hier http://stackoverflow.com/questions/33912186/using-pocos-when-persisting-to-azure-table -Storage hat einige gute Optionen in den Links von Rory Primrose, obwohl sie ein bisschen über meine derzeitige Fähigkeitsstufe hinausgehen können. Scheint so, als ob Sie von POCOs erben und ITableEntity implementieren können und damit durchkommen, obwohl es nicht ideal ist. –

Verwandte Themen