Platformlar Arası Uygulama Örnek Olay İncelemesi: Tasky

TaskyPortable , basit bir yapılacaklar listesi uygulamasıdır. Bu belgede, Platformlar Arası Uygulamalar Oluşturma belgesinin yönergelerini izleyerek nasıl tasarlandığı ve oluşturulduğu anlatılmaktadır. Tartışma aşağıdaki alanları kapsar:

Tasarım İşlemi

Kodlamaya başlamadan önce elde etmek istediğiniz şey için bir yol haritası oluşturmanız önerilir. Bu, özellikle birden çok şekilde kullanıma sunulacak işlevler oluşturduğunuz platformlar arası geliştirme için geçerlidir. Ne oluşturduğunuza dair net bir fikirle başlamak, geliştirme döngüsünün ilerleyen bölümlerinde zaman ve efor tasarrufu sağlar.

Gereksinimler

Uygulama tasarlamanın ilk adımı istenen özellikleri belirlemektir. Bunlar üst düzey hedefler veya ayrıntılı kullanım örnekleri olabilir. Tasky'nin basit işlevsel gereksinimleri vardır:

  • Görev listesini görüntüleme
  • Görev ekleme, düzenleme ve silme
  • Görevin durumunu 'bitti' olarak ayarlama

Platforma özgü özellikleri kullanımınızı göz önünde bulundurmalısınız. Tasky, iOS coğrafi sınırlama veya Windows Telefon Canlı Kutucuklardan yararlanabilir mi? İlk sürümde platforma özgü özellikleri kullanmasanız bile, iş ve veri katmanlarınızın bunları karşılayabileceğinden emin olmak için önceden planlamanız gerekir.

Kullanıcı Arabirimi Tasarımı

Hedef platformlarda uygulanabilecek üst düzey bir tasarımla başlayın. Platforma özgü kullanıcı arabirimi kısıtlamalarına dikkat edin. Örneğin, iOS'ta bir TabBarController beşten fazla düğme görüntüleyebilirken Windows Telefon eşdeğeri en fazla dört düğme görüntüleyebilir. Seçtiğiniz aracı kullanarak ekran akışını çizin (kağıt çalışır).

Draw the screen-flow using the tool of your choice paper works

Veri Modeli

Hangi verilerin depolanması gerektiğini bilmek, hangi kalıcılık mekanizmasının kullanılacağını belirlemeye yardımcı olur. Kullanılabilir depolama mekanizmaları hakkında bilgi edinmek ve aralarında karar verme konusunda yardımcı olmak için bkz . Platformlar Arası Veri Erişimi . Bu proje için SQLite.NET kullanacağız.

Tasky'nin her 'TaskItem' için üç özellik depolaması gerekir:

  • Ad – Dize
  • Notlar – Dize
  • Bitti – Boole dili

Çekirdek İşlevsellik

Kullanıcı arabiriminin gereksinimleri karşılamak için tüketmesi gereken API'yi göz önünde bulundurun. Yapılacaklar listesi aşağıdaki işlevleri gerektirir:

  • Tüm görevleri listeleme – tüm kullanılabilir görevlerin ana ekran listesini görüntülemek için
  • Görev satırına dokunulduğunda bir görev alma
  • Bir görevi kaydetme – bir görev düzenlendiğinde
  • Bir görevi silme – bir görev silindiğinde
  • Boş görev oluşturma – yeni görev oluşturulduğunda

Kodu yeniden kullanmak için bu API Taşınabilir Sınıf Kitaplığı'nda bir kez uygulanmalıdır.

Uygulama

Uygulama tasarımı üzerinde anlaşmaya varıldıktan sonra, bunun platformlar arası bir uygulama olarak nasıl uygulanabileceğini göz önünde bulundurun. Bu, uygulamanın mimarisine dönüşür. Platformlar Arası Uygulamalar Oluşturma belgesindeki yönergelerin ardından uygulama kodu aşağıdaki bölümlere ayrılmalıdır:

  • Ortak Kod : Görev verilerini depolamak için yeniden kullanılabilir kod içeren ortak bir projedir; verilerin kaydedilmesini ve yüklenmesini yönetmek için model sınıfını ve API'yi kullanıma sunar.
  • Platforma Özgü Kod – Ortak kodu 'arka uç' olarak kullanarak her işletim sistemi için yerel bir kullanıcı arabirimi uygulayan platforma özgü projeler.

Platform-specific projects implement a native UI for each operating system, utilizing the common code as the back end

Bu iki bölüm aşağıdaki bölümlerde açıklanmıştır.

Ortak (PCL) Kod

Tasky Portable, ortak kodu paylaşmak için Taşınabilir Sınıf Kitaplığı stratejisini kullanır. Kod paylaşım seçeneklerinin açıklaması için Bkz. Paylaşım Kodu Seçenekleri belgesi.

Veri erişim katmanı, veritabanı kodu ve sözleşmeler de dahil olmak üzere tüm yaygın kodlar kitaplık projesine yerleştirilir.

PCL projesinin tamamı aşağıda gösterilmiştir. Taşınabilir kitaplıktaki tüm kodlar hedeflenen her platformla uyumludur. Dağıtıldığında, her yerel uygulama bu kitaplığa başvurur.

When deployed, each native app will reference that library

Aşağıdaki sınıf diyagramında sınıflar katmana göre gruplandırılır. SQLiteConnection sınıfı, Sqlite-NET paketinden gelen ortak koddur. Sınıfların geri kalanı Tasky için özel kodlardır. TaskItemManager ve TaskItem sınıfları, platforma özgü uygulamalara sunulan API'yi temsil edilir.

The TaskItemManager and TaskItem classes represent the API that is exposed to the platform-specific applications

Katmanları ayırmak için ad alanlarının kullanılması, her katman arasındaki başvuruların yönetilmesine yardımcı olur. Platforma özgü projelerin yalnızca İş Katmanı için bir using deyimi içermesi gerekir. Veri Erişim Katmanı ve Veri Katmanı, İş Katmanı'nda kullanıma sunulan API tarafından TaskItemManager kapsüllenmelidir.

Başvurular

Taşınabilir sınıf kitaplıklarının, her biri platform ve çerçeve özellikleri için farklı düzeyde destek düzeyine sahip olan birden çok platformda kullanılabilir olması gerekir. Bu nedenle, paketlerin ve çerçeve kitaplıklarının kullanılabilmesi için sınırlamalar vardır. Örneğin, Xamarin.iOS c# dynamic anahtar sözcüğünü desteklemez, bu nedenle taşınabilir bir sınıf kitaplığı, bu tür bir kod Android'de çalışsa bile dinamik koda bağlı olan herhangi bir paketi kullanamaz. Mac için Visual Studio uyumsuz paketler ve başvurular eklemenizi engeller, ancak daha sonra sürprizlerden kaçınmak için sınırlamaları göz önünde bulundurmanız gerekir.

Not: Projelerinizin kullanmadığınız çerçeve kitaplıklarına başvurduğunu göreceksiniz. Bu başvurular, Xamarin proje şablonlarının bir parçası olarak eklenir. Uygulamalar derlendiğinde, bağlama işlemi başvurulmamış kodu kaldırır, bu nedenle başvurulsa bile System.Xml , xml işlevleri kullanmadığımız için son uygulamaya dahil edilmeyecektir.

Veri Katmanı (DL)

Veri Katmanı, verilerin fiziksel depolamasını (bir veritabanına, düz dosyalara veya başka bir mekanizmaya) yerine getiren kodu içerir. Tasky veri katmanı iki bölümden oluşur: SQLite-NET kitaplığı ve bunu bağlamaya eklenen özel kod.

Tasky, Nesne İlişkisel Eşleme (ORM) veritabanı arabirimi sağlayan SQLite-NET kodunu eklemek için Sqlite-net NuGet paketini (Frank Krueger tarafından yayımlandı) kullanır. TaskItemDatabase sınıfı öğesinden SQLiteConnection devralır ve SQLite'e veri okumak ve yazmak için gerekli Create, Read, Update, Delete (CRUD) yöntemlerini ekler. Diğer projelerde yeniden kullanılabilecek genel CRUD yöntemlerinin basit bir ortak uygulamasıdır.

TaskItemDatabase tekildir ve tüm erişimin aynı örnekte gerçekleşmesini sağlar. Birden çok iş parçacığından eşzamanlı erişimi engellemek için bir kilit kullanılır.

Windows Telefon'da SQLite

iOS ve Android işletim sisteminin bir parçası olarak SQLite ile birlikte gönderilse de, Windows Telefon uyumlu bir veritabanı altyapısı içermez. Kodu üç platformda da paylaşmak için SQLite'in Windows phone'a özel bir sürümü gereklidir. Sqlite için Windows Telefon projenizi ayarlama hakkında daha fazla bilgi için bkz. Yerel Veritabanı ile çalışma.

Veri Erişimini Genelleştirmek için Arabirim Kullanma

Veri Katmanı, birincil anahtar gerektiren soyut veri erişim yöntemlerini uygulayabilmesi için bir bağımlılığı BL.Contracts.IBusinessIdentity alır. Daha sonra arabirimini uygulayan herhangi bir İş Katmanı sınıfı Veri Katmanı'nda kalıcı hale gelebilir.

Arabirimi yalnızca birincil anahtar olarak davranacak bir tamsayı özelliğini belirtir:

public interface IBusinessEntity {
    int ID { get; set; }
}

Temel sınıf arabirimini uygular ve SQLite-NET özniteliklerini otomatik olarak artan birincil anahtar olarak işaretlemek için ekler. Bu temel sınıfı uygulayan İş Katmanı'ndaki tüm sınıflar Veri Katmanı'nda kalıcı hale gelebilir:

public abstract class BusinessEntityBase : IBusinessEntity {
    public BusinessEntityBase () {}
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
}

Veri Katmanı'nda arabirimini kullanan genel yöntemlere örnek olarak şu GetItem<T> yöntem gösteriliyor:

public T GetItem<T> (int id) where T : BL.Contracts.IBusinessEntity, new ()
{
    lock (locker) {
        return Table<T>().FirstOrDefault(x => x.ID == id);
    }
}

Eşzamanlı Erişimi engellemek için kilitleme

Veritabanına eşzamanlı erişimi önlemek için sınıfı içinde TaskItemDatabase bir kilit uygulanır. Bu, farklı iş parçacıklarından eşzamanlı erişimin seri hale getirildiğinden emin olmaktır (aksi takdirde bir kullanıcı arabirimi bileşeni arka plan iş parçacığı veritabanını güncelleştirirken veritabanını okumaya çalışabilir). Kilidin nasıl uygulandığına ilişkin bir örnek burada gösterilmiştir:

static object locker = new object ();
public IEnumerable<T> GetItems<T> () where T : BL.Contracts.IBusinessEntity, new ()
{
    lock (locker) {
        return (from i in Table<T> () select i).ToList ();
    }
}
public T GetItem<T> (int id) where T : BL.Contracts.IBusinessEntity, new ()
{
    lock (locker) {
        return Table<T>().FirstOrDefault(x => x.ID == id);
    }
}

Veri Katmanı kodunun çoğu diğer projelerde yeniden kullanılabilir. Katmandaki uygulamaya özgü tek kod oluşturucudaki TaskItemDatabase çağrıdırCreateTable<TaskItem>.

Veri Erişim Katmanı (DAL)

TaskItemRepository sınıfı, veri depolama mekanizmasını nesnelerin oluşturulmasına, silinmesine, alınmasına ve güncelleştirilmesini sağlayan TaskItem kesin olarak belirlenmiş bir API ile kapsüller.

Koşullu Derleme Kullanma

sınıfı, dosya konumunu ayarlamak için koşullu derleme kullanır. Bu, Platform Ayrıştırma'nın uygulanmasına bir örnektir. Yolu döndüren özellik, her platformda farklı koda derler. Kod ve platforma özgü derleyici yönergeleri burada gösterilmiştir:

public static string DatabaseFilePath {
    get {
        var sqliteFilename = "TaskDB.db3";
#if SILVERLIGHT
        // Windows Phone expects a local path, not absolute
        var path = sqliteFilename;
#else
#if __ANDROID__
        // Just use whatever directory SpecialFolder.Personal returns
        string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#else
        // we need to put in /Library/ on iOS5.1+ to meet Apple's iCloud terms
        // (they don't want non-user-generated data in Documents)
        string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
        string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder
#endif
        var path = Path.Combine (libraryPath, sqliteFilename);
                #endif
                return path;
    }
}

Platforma bağlı olarak çıkış, iOS için "<uygulama yolu>/Library/TaskDB.db3", Android için "<uygulama yolu>/Belgeler/TaskDB.db3" veya Yalnızca Windows Telefon için "TaskDB.db3" olacaktır.

İş Katmanı (BL)

İş Katmanı, model sınıflarını ve bunları yönetmek için bir Cephe uygular. Tasky'de Model sınıfıdır TaskItem ve TaskItemManager yönetimi için bir API sağlamak üzere Cephe desenini TaskItemsuygular.

Cephe

TaskItemManagerDAL.TaskItemRepository Uygulama ve UI Katmanları tarafından başvurulacak Get, Save ve Delete yöntemlerini sağlamak için öğesini sarmalar.

gerekirse iş kuralları ve mantığı buraya yerleştirilir; örneğin, bir nesne kaydedilmeden önce karşılanması gereken doğrulama kuralları.

Platforma Özgü Kod için API

Ortak kod yazıldıktan sonra, kullanıcı arabirimi tarafından kullanıma sunulan verileri toplamak ve görüntülemek için oluşturulmalıdır. sınıfı, TaskItemManager uygulama kodunun erişmesi için basit bir API sağlamak üzere Cephe düzenini uygular.

Platforma özgü her projede yazılan kod genellikle bu cihazın yerel SDK'sıyla sıkı bir şekilde birleştirilir ve yalnızca tarafından tanımlanan API'yi kullanarak ortak koda erişin TaskItemManager. Bu, TaskItemgibi kullanıma sunulan yöntemleri ve iş sınıflarını içerir.

Görüntüler platformlar arasında paylaşılmaz, ancak her projeye bağımsız olarak eklenir. Her platform farklı dosya adlarını, dizinleri ve çözümleri kullanarak görüntüleri farklı işlediğinden bu önemlidir.

Kalan bölümlerde Tasky kullanıcı arabiriminin platforma özgü uygulama ayrıntıları ele alınıyor.

iOS Uygulaması

Verileri depolamak ve almak için ortak PCL projesini kullanarak iOS Tasky uygulamasını uygulamak için gereken yalnızca birkaç sınıf vardır. iOS Xamarin.iOS projesinin tamamı aşağıda gösterilmiştir:

iOS project is shown here

Sınıflar bu diyagramda gösterilir ve katmanlar halinde gruplandırılır.

The classes are shown in this diagram, grouped into layers

Başvurular

iOS uygulaması platforma özgü SDK kitaplıklarına başvurur; örneğin. Xamarin.iOS ve MonoTouch.Dialog-1.

Ayrıca PCL projesine başvurması TaskyPortableLibrary gerekir. Başvuru listesi burada gösterilmiştir:

The references list is shown here

Uygulama Katmanı ve Kullanıcı Arabirimi Katmanı bu başvurular kullanılarak bu projede uygulanır.

Uygulama Katmanı (AL)

Uygulama Katmanı, PCL tarafından kullanıcı arabirimine sunulan nesneleri 'bağlamak' için gereken platforma özgü sınıflar içerir. iOS'a özgü uygulamanın görevleri görüntülemeye yardımcı olacak iki sınıfı vardır:

  • EditingSource – Bu sınıf, görev listelerini kullanıcı arabirimine bağlamak için kullanılır. MonoTouch.Dialog Görev listesi için kullanıldığından, içinde çekme-silme işlevini etkinleştirmek için bu yardımcıyı UITableView uygulamamız gerekir. Çekme-silme işlemi iOS'ta yaygındır, ancak Android veya Windows Telefon değildir, bu nedenle bunu uygulayan tek proje iOS'a özgü projedir.
  • TaskDialog : Bu sınıf, kullanıcı arabirimine tek bir görev bağlamak için kullanılır. Giriş ekranının MonoTouch.Dialog doğru biçimlendirilmesine izin vermek için nesneyi doğru öznitelikleri içeren bir sınıfla 'sarmalamak' TaskItem için Düşünceler ion API'sini kullanır.

sınıfı, bir sınıfın TaskDialog özelliklerine göre ekran oluşturmak için öznitelikleri kullanır MonoTouch.Dialog . sınıfı şöyle görünür:

public class TaskDialog {
    public TaskDialog (TaskItem task)
    {
        Name = task.Name;
        Notes = task.Notes;
        Done = task.Done;
    }
    [Entry("task name")]
    public string Name { get; set; }
    [Entry("other task info")]
    public string Notes { get; set; }
    [Entry("Done")]
    public bool Done { get; set; }
    [Section ("")]
    [OnTap ("SaveTask")]    // method in HomeScreen
    [Alignment (UITextAlignment.Center)]
    public string Save;
    [Section ("")]
    [OnTap ("DeleteTask")]  // method in HomeScreen
    [Alignment (UITextAlignment.Center)]
    public string Delete;
}

OnTap Özniteliklerin bir yöntem adı gerektirdiğine dikkat edin; bu yöntemlerin oluşturulduğu sınıfta MonoTouch.Dialog.BindingContext bulunması gerekir (bu örnekte, HomeScreen sonraki bölümde ele alınan sınıf).

Kullanıcı Arabirimi Katmanı (UI)

Kullanıcı Arabirimi Katmanı aşağıdaki sınıflardan oluşur:

  1. AppDelegate : Uygulamada kullanılan yazı tiplerini ve renkleri stilize etmek için Görünüm API'sine yapılan çağrıları içerir. Tasky basit bir uygulama olduğundan içinde FinishedLaunching çalışan başka başlatma görevi yoktur.
  2. Ekranlar – her bir ekranı ve davranışını tanımlayan alt sınıfları UIViewController . Ekranlar, kullanıcı arabirimini Uygulama Katmanı sınıfları ve ortak API ( TaskItemManager ) ile birleştirir. Bu örnekte ekranlar kodda oluşturulmuştur, ancak Xcode'un Arabirim Oluşturucusu veya görsel taslak tasarımcısı kullanılarak tasarlanmış olabilir.
  3. Görüntüler – Görsel öğeler her uygulamanın önemli bir parçasıdır. Tasky, iOS için normal ve Retina çözünürlükte sağlanması gereken giriş ekranı ve simge görüntülerine sahiptir.

Giriş Ekranı

Giriş Ekranı, SQLite veritabanındaki görevlerin listesini görüntüleyen bir ekrandır MonoTouch.Dialog . öğesinden DialogViewController devralır ve görüntü için bir nesne koleksiyonu TaskItem içerecek şekilde ayarlamak Root üzere kodu uygular.

It inherits from DialogViewController and implements code to set the Root to contain a collection of TaskItem objects for display

Görev listesini görüntüleme ve görev listesiyle etkileşim kurma ile ilgili iki ana yöntem şunlardır:

  1. PopulateTable – Görüntülenecek nesne koleksiyonunu almak için İş Katmanı'nın TaskManager.GetTasksTaskItem yöntemini kullanır.
  2. Seçili – Bir satıra dokunulduğunda, görevi yeni bir ekranda görüntüler.

Görev Ayrıntıları Ekranı

Görev Ayrıntıları, görevlerin düzenlenmesine veya silinmesine izin veren bir giriş ekranıdır.

Tasky ekranı görüntülemek için 'Düşünceler ion API'sini kullanırMonoTouch.Dialog, bu nedenle uygulama yokturUIViewController. Bunun yerine, HomeScreen sınıf örneği oluşturur ve Uygulama Katmanı'ndan sınıfını TaskDialog kullanarak bir DialogViewController görüntüler.

Bu ekran görüntüsü, Ad ve Notlar Entry alanlarında filigran metnini ayarlama özniteliğini gösteren boş bir ekran gösterir:

This screenshot shows an empty screen that demonstrates the Entry attribute setting the watermark text in the Name and Notes fields

Burada oluşturulduğundan, Görev Ayrıntıları ekranının işlevselliği (görevi kaydetme veya silme gibi) sınıfında MonoTouch.Dialog.BindingContext uygulanmalıdırHomeScreen. Aşağıdaki HomeScreen yöntemler Görev Ayrıntıları ekranını destekler:

  1. ShowTaskDetails : Bir ekranı işlemek için bir MonoTouch.Dialog.BindingContext oluşturur. Sınıfından özellik adlarını ve türlerini TaskDialog almak için yansıma kullanarak giriş ekranını oluşturur. Giriş kutuları için filigran metni gibi ek bilgiler, özelliklerdeki özniteliklerle uygulanır.
  2. SaveTask : Bu yönteme sınıfında bir OnTap öznitelik aracılığıyla başvurulurTaskDialog. Kaydet tuşuna basıldığında çağrılır ve kullanarak TaskItemManager değişiklikleri kaydetmeden önce kullanıcı tarafından girilen verileri almak için öğesini MonoTouch.Dialog.BindingContext kullanır.
  3. DeleteTask : Bu yönteme sınıfında bir OnTap öznitelik aracılığıyla başvurulurTaskDialog. Birincil anahtarı (ID özelliği) kullanarak verileri silmek için kullanır TaskItemManager .

Android Uygulaması

Xamarin.Android projesinin tamamı aşağıda resmedilir:

Android project is pictured here

Sınıf diyagramı, sınıflar katmana göre gruplandırılır:

The class diagram, with classes grouped by layer

Başvurular

Android uygulama projesi, Android SDK'dan sınıflara erişmek için platforma özgü Xamarin.Android derlemesine başvurmalıdır.

Ayrıca PCL projesine de başvurmalıdır (örn. TaskyPortableLibrary) öğesini seçip ortak veri ve iş katmanı koduna erişin.

TaskyPortableLibrary to access the common data and business layer code

Uygulama Katmanı (AL)

Daha önce incelediğimiz iOS sürümüne benzer şekilde, Android sürümündeki Uygulama Katmanı, Çekirdek tarafından kullanıcı arabirimine sunulan nesneleri 'bağlamak' için gereken platforma özgü sınıflar içerir.

TaskListAdapter – Bir Nesne Listesi<T'sini> görüntülemek için içinde özel nesneleri ListViewgörüntülemek için bir bağdaştırıcı uygulamamız gerekir. Bağdaştırıcı, listedeki her öğe için hangi düzenin kullanılacağını denetler; bu durumda kod, Android yerleşik düzenini SimpleListItemCheckedkullanır.

Kullanıcı Arabirimi (UI)

Android uygulamasının Kullanıcı Arabirimi Katmanı, kod ve XML işaretlemesinin bir bileşimidir.

  • Kaynaklar/Düzen – ekran düzenleri ve AXML dosyaları olarak uygulanan satır hücresi tasarımı. AXML, Android için Xamarin kullanıcı arabirimi Tasarım Aracı kullanılarak elle yazılabilir veya görsel olarak yerleştirilebilir.
  • Kaynaklar/Çizilebilir – resimler (simgeler) ve özel düğme.
  • Ekranlar – Her ekranı ve davranışını tanımlayan etkinlik alt sınıfları. Kullanıcı arabirimini Uygulama Katmanı sınıfları ve ortak API (TaskItemManager) ile birleştirir.

Giriş Ekranı

Giriş Ekranı bir Etkinlik alt sınıfından HomeScreenHomeScreen.axml ve düzeni tanımlayan dosyadan (düğmenin ve görev listesinin konumu) oluşur. Ekran şöyle görünür:

The screen looks like this

Giriş Ekranı kodu, düğmeye ve listedeki öğelere tıklamanın yanı sıra yöntemdeki OnResume listeyi doldurmaya yönelik işleyicileri tanımlar (böylece Görev Ayrıntıları Ekranında yapılan değişiklikleri yansıtır). Veriler İş Katmanı'nın ve TaskListAdapter Uygulama Katmanı'ndan TaskItemManager kullanılarak yüklenir.

Görev Ayrıntıları Ekranı

Görev Ayrıntıları Ekranı ayrıca bir Activity alt sınıf ve bir AXML düzen dosyasından oluşur. Düzen, giriş denetimlerinin konumunu belirler ve C# sınıfı nesneleri yükleme ve kaydetme TaskItem davranışını tanımlar.

The class defines the behavior to load and save TaskItem objects

PCL kitaplığına yapılan tüm başvurular sınıfı üzerinden TaskItemManager yapılır.

Windows Telefon Uygulaması

Windows Telefon projesinin tamamı:

Windows Phone App The complete Windows Phone project

Aşağıdaki diyagramda katmanlar halinde gruplandırılmış sınıflar gösterilir:

This diagram presents the classes grouped into layers

Başvurular

Platforma özgü proje, geçerli bir Windows Telefon uygulaması oluşturmak için gerekli platforma özgü kitaplıklara (ve gibi Microsoft.PhoneSystem.Windows) başvurmalıdır.

Ayrıca sınıfını ve veritabanını kullanmak için PCL projesine (örn. TaskyPortableLibrary) başvurması TaskItem gerekir.

TaskyPortableLibrary to utilize the TaskItem class and database

Uygulama Katmanı (AL)

iOS ve Android sürümlerinde olduğu gibi uygulama katmanı da kullanıcı arabirimine veri bağlamaya yardımcı olan görsel olmayan öğelerden oluşur.

Görünüm Modelleri

ViewModel'ler VERILERI PCL ' den ( TaskItemManager) sarmalar ve Silverlight/XAML veri bağlaması tarafından kullanılabilecek şekilde sunar. Bu, platforma özgü bir davranış örneğidir (Platformlar Arası Uygulamalar belgesinde açıklandığı gibi).

Kullanıcı Arabirimi (UI)

XAML, işaretlemede bildirilebilen ve nesneleri görüntülemek için gereken kod miktarını azaltabilen benzersiz bir veri bağlama özelliğine sahiptir:

  1. Sayfalar – XAML dosyaları ve bunların codebehind'i kullanıcı arabirimini tanımlar ve verileri görüntülemek ve toplamak için ViewModel'lere ve PCL projesine başvurur.
  2. Görüntüler – Giriş ekranı, arka plan ve simge görüntüleri, kullanıcı arabiriminin önemli bir parçasıdır.

Anasayfa

MainPage sınıfı, XAML'nin veri bağlama özelliklerini kullanarak verileri görüntülemek için öğesini TaskListViewModel kullanır. Sayfa DataContext , zaman uyumsuz olarak doldurulan görünüm modeline ayarlanır. {Binding} XAML'deki söz dizimi, verilerin nasıl görüntüleneceğini belirler.

TaskDetailsPage

Her görev, öğesini TaskDetailsPage.xaml dosyasında tanımlanan XAML'ye bağlayarak TaskViewModel görüntülenir. Görev verileri İş Katmanı'ndaki aracılığıyla TaskItemManager alınır.

Sonuçlar

Sonuçta elde edilen uygulamalar her platformda şöyle görünür:

iOS

Uygulama, gezinti çubuğuna konumlandırılan 'ekle' düğmesi ve yerleşik artı (+) simgesi gibi iOS standart kullanıcı arabirimi tasarımını kullanır. Ayrıca varsayılan UINavigationController 'geri' düğme davranışını kullanır ve tabloda 'swipe-to-delete' özelliğini destekler.

It also uses the default UINavigationController back button behavior and supports swipe-to-delete in the tableIt also uses the default UINavigationController back button behavior and supports swipe-to-delete in the table

Android

Android uygulaması, 'onay işareti' görüntülenmesini gerektiren satırlar için yerleşik düzen de dahil olmak üzere yerleşik denetimleri kullanır. Ekran geri düğmesine ek olarak donanım/sistem geri davranışı desteklenir.

The hardware/system back behavior is supported in addition to an on-screen back buttonThe hardware/system back behavior is supported in addition to an on-screen back button

Windows Phone

Windows Telefon uygulaması standart düzeni kullanır ve üstteki gezinti çubuğu yerine ekranın alt kısmındaki uygulama çubuğunu doldurarak.

The Windows Phone app uses the standard layout, populating the app bar at the bottom of the screen instead of a nav bar at the topThe Windows Phone app uses the standard layout, populating the app bar at the bottom of the screen instead of a nav bar at the top

Özet

Bu belge, iOS, Android ve Windows Telefon olmak üzere üç mobil platformda kod yeniden kullanımını kolaylaştırmak için katmanlı uygulama tasarımı ilkelerinin basit bir uygulamaya nasıl uygulandığına ilişkin ayrıntılı bir açıklama sağlamıştır.

Uygulama katmanlarını tasarlamak için kullanılan işlemi açıklamıştır ve her katmanda hangi kod ve işlevselliğin uygulandığını anlatmıştır.

Kod github'dan indirilebilir.