Podsumowanie tygodnia odc.7

Podsumowanie tygodnia odc.7

A więc mamy już piątek 05.05 więc czas na podsumowanie tygodnia odc.7. Za nami dziewiąty tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia. Dzisiaj wyjątkowo będzie bez linków i w trochę innej formie niż zazwyczaj.

Podsumowanie tygodnia odc.7

Co się udało

W tym tygodniu znowu spędziłem dużo czasu nad xUnit i… Zdałem sobie sprawę, że spora część kodu aplikacji będzie do przerobienia. Chciałbym utrzymać projekt w duchu TDD.

Co się nie udało

Nie udało mi się pchnąć samego tematu Xamarin.Forms do przodu ale za to wszedłem głębiej w xUnit.

Podsumowanie

A więc nadszedł czas zmian, oraz pogodzenia się z tym, że do końca konkursu nie dam rady ukończyć aplikacji. Nadal pozostaje dobrej myśli i chce zgłębiać tajniki Xamarin.Forms.

xUnit Theory: Jak używać InlineDate, ClassData lub MemberData

xUnit Theory: Jak używać InlineData, ClassData oraz MemberData

Ciąg dalszy cyklu o xUnit, oraz testowaniu aplikacji mobilnych w Xamarin.Forms.

Dzisiaj chciałbym omówić zastosowanie, oraz pokazać parę przykładów użycia Theory.

xUnit Theory: Jak używać InlineData, ClassData oraz MemberData

Czym jest Theory

Testy z atrybutem Theory umożliwiają nam przekazanie jako parametr danych wejściowych (może to być również kolekcja parametrów). Natomiast ich wynik jest poprawny tylko dla konkretnych dany wejściowych, czyli za jednym zamachem możemy przetestować pozytywne i negatywne przypadki.

Jak przekazać dane do metody

Żeby przekazać dane do metody możemy użyć jednego z 3 atrybutów InlineData, ClassData lub MemberData.

  • InlineData – umożliwia nam przekazanie danych typów prostych string, int, decimal, itd.
  • ClassData – umożliwia nam przekazanie typów złożonych
  • MemberData – umożliwia nam przekazanie typów złożonych z tą różnicą, że nie wymaga definiowania nowej klasy. Może to być dowolny obiekt, który zwraca IEnumerable

Przykłady użycia

Poniżej kilka przykładów implementacji każdego typu atrybutu.

InlineData

        [Theory]
        [InlineData("2017-04-15")]
        [InlineData("2017-04-16")]
        [InlineData("2017-04-17")]
        public async void CanGetDifferentProblemsForEachDayWhichIsNotNull(DateTime currentDate)
        {
            //Arrange
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(currentDate);

            //Assert
            Assert.NotNull(problem);
        }

ClassData

    public class TodoItemsTestData : IEnumerable<object[]>
    {
        private readonly List<object[]> data = new List<object[]>
        {
            new object[] { Guid.NewGuid(), string.Empty, false, null},
            new object[] { Guid.NewGuid(), "Buy tickets for movie", false, null },
            new object[] { Guid.NewGuid(), string.Empty, false, null },
            new object[] { Guid.NewGuid(), "Buy a milk", true, null },
        };

        public IEnumerator<object[]> GetEnumerator() => data.GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
....
        [Theory]
        [ClassData(typeof(TodoItemsTestData))]
        public async void CantAddTodoItemWithoutTitle(Guid id, string title, bool done, DateTime? dueDate)
        {
            //Arrange
            DataService service = new DataService();
            TodoItem item = new TodoItem { Id = id, Name = title, Done = done, DueDate = dueDate };

            //Act
            var ex = await Assert.ThrowsAsync<ArgumentException>(() => service.AddTodoItemAsync(item));

            //Assert
            Assert.IsType<ArgumentException>(ex);

MemberData

    public class TodoTheoryData<T> : TheoryData<T>
    {
        public TodoTheoryData(IEnumerable<T> data)
        {
            foreach (T t1 in data)
            {
                Add(t1);
            }
        }
    }
    public class DataServiceTests
    {
        private static TodoItem[] todoItems = new TodoItem[]
        {
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a milk", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a TV", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a new iPhone", Done = false, DueDate = DateTime.Today},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a pomodoro", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a bread", Done = false, DueDate = null}
        };

        public static TodoTheoryData<TodoItem> TodoItemsData { get; } = new TodoTheoryData<TodoItem>(todoItems);

        [Theory]
        [MemberData(nameof(TodoItemsData))]
        public async void InStorageAreFiveItems(TodoItem item)
        {
            //Arrange
            DataService service = new DataService();
            await service.AddTodoItemAsync(item);

            //Act
            IEnumerable<TodoItem> todoItems = await service.GetAllAsync();

            //Assert
            Assert.Equal(5, todoItems.Count());
        }
    }

Podsumowanie

Jak widzicie użycie Theory daje nam dużo benefitów i ułatwia nam testowanie aplikacji mobilnych napisanych w Xamarin.Forms ale i nie tylko.

Z użyciem xUnit możemy testować całą pulę aplikacji na platformie .Net od aplikacji Desktop, Mobile aż po Web.

Pomocne linki

Jeżeli chcecie poczytać coś więcej o xUnit Theory to odsyłam was do poniższych linków:

Podsumowanie tygodnia odc.6

Podsumowanie tygodnia odc.6

A więc mamy już piątek 28.04 więc czas na podsumowanie tygodnia odc.6. Za nami ósmy tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.6

Co się udało

Zrobiłem całkiem spory kawałek testów jednostkowych w xUnit, oraz nauczyłem się używać go testowania aplikacji pisanych w Xamarin.Forms.

Co się nie udało

Nie udało mi się zaimplementować ekranu kalendarza, oraz części lokalnej bazy danych. Te dwa punkty będą do zrealizowania w najbliższym tygodniu.

Ciekawe linki tygodnia

Podsumowanie

Do zobaczenia za tydzień w kolejnym odcinku Podsumowania Tygodnia

3 najważniejsze słowa w xUnit

3 najważniejsze słowa w xUnit

Aplikacje stają się coraz bardziej skomplikowane, zawierają mnóstwo logiki biznesowej dlatego testy jednostkowe w naszych aplikacjach są ich ważnym aspektem. Dzisiaj chciałbym wam przedstawić 3 najważniejsze słowa w xUnit.

3 najważniejsze słowa w xUnit

Fact, Theory, Assert – Arrange, Act, Assert

Każdy test powinien mieć odpowiednią strukturę. Dlatego ja zawsze dziele je na etap inicjalizacji Arrange, etap wykonania Act i etap porównania wyników Assert.

Przykładowa metoda do testów może mieć następującą strukturę

public void TestMethod1()
{
    //Arrange

    //Act

    //Assert
}

Fact

Jest to podstawowy typ testu w xUnit. W porównaniu do innych framework-ów każdy test stanowi odrębną jednostkę. W każdym z nich należy zainicjalizować wymagane komponenty jak również zapewnić obsługę rollback.

Poniższy przykład ma na celu przetestowanie warstwy serwisu naszej aplikacji i mechanizmu pobierania danych na konkretną datę.

Metoda ta składa się z sekcji inicjalizacji Arrang, wykonania Act, oraz sprawdzenia warunku Assert.

        [Fact]
        public async void CanGetProblemForDate_20170415()
        {
            //Arrange
            DateTime expected = new DateTime(2017, 04, 15);
            DateTime actual = DateTime.Today;
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(new DateTime(2017, 04, 15));
            actual = problem.CreationDate;

            //Assert
            Assert.Equal(expected, actual);
        }

Theory

Co w sytuacji kiedy chcemy przetestować kolekcję przypadków testowych? Z pomocą przychodzi nam słówko Theory umożliwia ono nam dostarczenie parametrów wejściowych dla metody testowej.

Przykład użycia możecie zobaczyć na listingu poniżej.

        [Theory]
        [InlineData("2017-04-15")]
        [InlineData("2017-04-16")]
        [InlineData("2017-04-17")]
        public async void CanGetDifferentProblemsForEachDayWhichIsNotNull(DateTime currentDate)
        {
            //Arrange
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(currentDate);

            //Assert
            Assert.NotNull(problem);
        }

Jeżeli jest nam potrzebny bardziej zaawansowany sposób użycia Theory w którym przekazujemy nasz obiekt jako parametr wejściowy możemy użyć do tego klasy TheoryData.

Przykład użycia na poniższym listingu testuje nam dodawanie kolejnych TodoItem do naszej warstwy serwisu.

    public class DataServiceTests
    {
        private static TodoItem[] todoItems = new TodoItem[]
        {
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a milk", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a TV", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a new iPhone", Done = false, DueDate = DateTime.Today},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a pomodoro", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a bread", Done = false, DueDate = null}
        };

        public static TodoTheoryData<TodoItem> TodoItemsData { get; } = new TodoTheoryData<TodoItem>(todoItems);

        [Theory]
        [MemberData("TodoItemsData")]
        public async void InStorageAreFiveItems(TodoItem item)
        {
            //Arrange
            DataService service = new DataService();
            await service.AddTodoItemAsync(item);

            //Act
            IEnumerable<TodoItem> todoItems = await service.GetAllAsync();

            //Assert
            Assert.Equal(5, todoItems.Count());
        }
    }

    public class TodoTheoryData<T> : TheoryData<T>
    {
        public TodoTheoryData(IEnumerable<T> data)
        {
            foreach (T t1 in data)
            {
                Add(t1);
            }
        }
    }

Assert

Klasa Assert dostarcza nam implementację różnych metod wykorzystywanych do sprawdzania naszych wyników, oraz np. oczekiwanych wyjątków.

Podsumowanie

Jak widzicie w prosty sposób można testować aplikacje Xamarin.Forms z użyciem xUnit. Kolejny punkt na liście projektu 10Things to dodanie źródła danych offline z wykorzystaniem bazy SQLite lub Realm.

Tutaj pytanie do czytelników, która baza oferuje lepszy mechanizm synchronizacji offline-online.

Podsumowanie tygodnia odc.5

Podsumowanie tygodnia odc.5

A więc mamy już piątek 21.04 więc czas na podsumowanie tygodnia odc.5. Za nami siódmy tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.5

Co się udało

Tutaj niestety sukcesów brak projekt nie drgnął nawet o milimetr z blogiem niestety też jest ostatnio cienko.

Co się nie udało

Patrz punkt wyżej

Ciekawe linki tygodnia

Podsumowanie

Na dzisiaj byłoby to tylko tyle albo i aż.

Podsumowanie tygodnia odc.4

Podsumowanie tygodnia odc.4

A więc mamy już piątek 31.03 poniedziałek 03.04 więc czas na podsumowanie tygodnia odc.4. Za nami czwarty tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.4

Co się udało

  • Podłączyć testy xUnit – 10Things idzie powoli do przodu. Podłączyłem takie trochę Hello World w xUnit do aplikacji.
  • Refactor – Kolejny ważny punkt na liście, zmieniłem namespace i nazwy projektów na bardziej „ludzkie”.

Co się nie udało

  • 10Things – Idzie to zdecydowanie za wolno

Ciekawe linki tygodnia

Różne

Podsumowanie

Na dzisiaj byłoby to tylko tyle albo i aż.

Jak zacząć pisać testy z użyciem xUnit

10Things – Jak zacząć pisać testy z użyciem xUnit

Test-Driven Development jest tzw. dobrą praktyką programistyczną dzisiaj chciałbym przedstawić jak zacząć pisać testy z użyciem xUnit. Wszystko omówię na przykładzie aplikacji 10Things tworzonej w Xamarin Forms.

Test-Driven Development – Wprowadzenie

Według definicji z Wikipedia jest to

Test-driven development (TDD) – technika tworzenia oprogramowania, zaliczana do metodyk zwinnych. Pierwotnie była częścią programowania ekstremalnego (ang. extreme programming), lecz obecnie stanowi samodzielną technikę. Polega na wielokrotnym powtarzaniu kilku kroków:

1. Najpierw programista pisze automatyczny test sprawdzający dodawaną funkcjonalność. Test w tym momencie nie powinien się udać.
2. Później następuje implementacja funkcjonalności. W tym momencie wcześniej napisany test powinien się udać.
3. W ostatnim kroku programista dokonuje refaktoryzacji napisanego kodu, żeby spełniał on oczekiwane standardy.

Technika została stworzona przez Kenta Becka. Można jej też używać do poprawiania istniejącego kodu.

Testy w mobile

Jeżeli chodzi o testy na mobile możemy je podzielić na kilka typów:

  • Testy modeli MVVM, serwisów
  • Testy specyficzne dla każdej z platform: obsługa WiFi, bluetooth
  • Testy UI

Dzisiaj skupimy się na testach jednostkowych modeli, serwisów itp elementów aplikacji.

Na platformie Xamarin mamy do dyspozycji kilka opcji do wyboru ja skupiłem się na użyciu xUnit. O xUnit możecie sobie poczytać na stronie xunit.github.io. Ja go wybrałem ze względu na koncepcje w nim użyte.

Nie mamy tutaj metod typu SetUp lub TearDown, każdy test stanowi odrębny element i jest niezależnie inicjalizowany.

Jak zacząć pisać testy z użyciem xUnit – Wprowadzenie

    public class DataServiceTests
    {
        private readonly IDataService service;

        [Fact]
        public async Task CanGetProblemByDateAsync()
        {
            await Task.Run(() => throw new NotImplementedException());
        }

        [Fact]
        public async Task CanGetDailyIdeasByDateAsync()
        {
            await Task.Run(() => throw new NotImplementedException());
        }

Jest to fragment klasy do testów serwisu pobierającego dane z internetu. Ale jak to wszystko odpalić i skonfigurować?

W 10Things do testów Core używam biblioteki .Net Standard w wersji 1.4
Jak zacząć pisać testy z użyciem xUnit

Kolejnym krokiem był import pakietu NuGet

Install-Package xunit

Teraz możemy zająć się napisaniem naszego pierwszego testu

public class SimpleUnitTest
{
 [Fact]
 public async Task PositiveUnitTest()
 {
   await Task.Run(() => Assert.True(true));
 }
 
 [Fact]
 public async Task NegativeUnitTest()
 {
   await Task.Run(() => throw new Exception("boom"));
 } 
}

Jest to nasz pierwszy bardzo prosty test w xUnit. No dobra ale jak to uruchomić?

Tutaj z pomocą przychodzą nam xUnit Runners, a dokładniej

  • xunit.runner.visualstudio – odpowiadający za uruchamianie testów w Visual Studio
  • xunit.runner.devices – odpowiadający za uruchamianie testów na urządzeniu lub emulatorze

A więc tworzymy nowy pusty projekt Xamarin Android i importujemy pakiet NuGet xunit.runner.devices

Install-Package xunit.runner.devices

Uwaga jest problem z tym pakietem przynajmniej na mojej maszynie, a mianowicie musiałem ręcznie zaimportować pakiet NuGet xunit.assert

Install-Package xunit.assert

Następnym krokiem jest nadpisanie zawartości klasy MainActivity treścią z pliku MainActivity.cs.txt. Finalnie powinno to wyglądać następująco

using Android.App;
using Android.OS;
using TenThings.Core.Tests.PageModels;
using TenThings.Core.Tests.Services;
using Xunit.Runners.UI;
using Xunit.Sdk;

namespace TenThings.Droid.TestsRunner
{
    [Activity(Label = "xUnit Android Runner", MainLauncher = true, Theme = "@android:style/Theme.Material.Light")]
    public class MainActivity : RunnerActivity
    {

        protected override void OnCreate(Bundle bundle)
        {
            // tests can be inside the main assembly
            AddTestAssembly(typeof(DataServiceTests).Assembly);

            AddExecutionAssembly(typeof(ExtensibilityPointFactory).Assembly);
            // or in any reference assemblies			

            //AddTestAssembly(typeof(PortableTests).Assembly);
            // or in any assembly that you load (since JIT is available)

#if false
			// you can use the default or set your own custom writer (e.g. save to web site and tweet it 😉
			Writer = new TcpTextWriter ("10.0.1.2", 16384);
			// start running the test suites as soon as the application is loaded
			AutoStart = true;
			// crash the application (to ensure it's ended) and return to springboard
			TerminateAfterExecution = true;
#endif
            // you cannot add more assemblies once calling base
            base.OnCreate(bundle);
        }
    }
}

Ważnym elementem jest tutaj metoda

AddTestAssembly

odpowiada ona za załadowanie naszych testów.

Podsumowanie

Jak widzicie testy jednostkowe w aplikacjach pisanych w Xamarin Forms są bardzo dobrą praktyką. Umożliwiają one sprawdzenie w szybki sposób całej aplikacji. xUnit jest za to frameworkiem sprawdzonym w boju i jest używany przez team Microsoft np. w .Net Core.
A czy wy w swojej codziennej pracy używacie testów jednostkowych?

Podsumowanie tygodnia odc.3

Podsumowanie tygodnia odc.3

A więc mamy już piątek 24.03 więc czas na podsumowanie tygodnia odc.3. Za nami trzeci tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.3

Co się udało

  • Kupić samochód – tak odkładałem to w czasie, a w końcu wyszło tak, że kupiłem już teraz. Strasznie mnie to wytrąciło z moich torów\planów i teraz nie mogę się pozbierać.
  • Obrączki – Kolejny ważny punkt na liści, odebraliśmy wreszcie obrączki.

Co się nie udało

  • 10Things – Założony plan z podpięcie testów xUnit legł w gruzach. Patrz punkty powyżej.

Ciekawe linki tygodnia

Xamarin

Różne

Podsumowanie

Od najbliższego tygodnia wracam do gry i mam nadzieję, że uda mi się przyśpieszyć pracę nad projektem.

Podsumowanie tygodnia odc.2

Podsumowanie tygodnia odc.2

A więc mamy już piątek 17.03 więc czas na podsumowanie tygodnia odc.2. Za nami drugi tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.2

Co się udało

  • 10Things – prace nad projektem nabierają powoli tempa. Udało mi się zrobić nawigację i zacząłem podłączać testy jednostkowe xUnit.
  • Praca – chyba „przekopałem się” przez cały gąszcz zgłoszeń od klienta i opanowałem sytuację w projekcie.
  • Odpoczynek – znalazłem przyczynę ostatniego zmęczenia (brak lub niedobory snu). Czas na wdrożenie nowego planu tygodnia.

Co się nie udało

  • Praca – chciałem żeby projekt wyszedł lepiej ale nie zawsze się projekty udają :).

Ciekawe linki tygodnia

Xamarin

Architektura

Enterprise

10Things - Implementacja kontenera IoC

10Things – Implementacja kontenera IoC

Ciąg dalszy pracy na projektem 10Things. W dzisiejszym odcinku chciałbym opisać szczegóły implementacji kontenera IoC, oraz dalszy plan prac.

Implementacja kontenera IoC

W 10Things używam FreshMVVM, który ma zaimplementowany kontener IoC o nazwie FreshIoC. Pod spodem nie jest to nic innego jak TinyIoC ze zmienionymi namespace.

Jakie ma plus FreshIoC <-> TinyIoC?

  • Mały rozmiar – bibliotek FreshIoC waży tylko 42 Kb co czyni ją jedną z najlżejszych implementacji kontenera IoC
  • Prostota – robi tylko to co od niej oczekujemy, nie ma tutaj różnych „wodotrysków”
  • Szybkość – ze względu na rozmiar i prostotę jest bardzo szybki

Jakie ma minusy  FreshIoC < – > TinyIoC?

  • Wodotryski – brakuje w nim różnych zaawansowanych funkcjonalności kontenerów IoC

No dobra ale co sam autor twierdzi\pisze o tej bibliotece? Jako, że nie ma szczegółowego opisu FreshIoC będę się wspierał opisem TinyIoC.

Witaj TinyIoC

Welcome to TinyIoC – an easy to use, hassle free, Inversion of Control Container. TinyIoC has been designed to fulfil a single key requirement – to lower the „level of entry” for using an IoC container; both for small projects, and developers who are new to IoC who might be „scared” of the „big boys”!

To that end, TinyIoC attempts to stick to the following core principals:

  • Simplfied Inclusion – No assembly to reference, no binary to worry about, just a single cs file you can include in your project and you’re good to go. It even works with both Mono and MonoTouch for iPhone development!
  • Simplified Setup – With auto-resolving of concrete types and an „auto registration” option for interfaces setup is a piece of cake. It can be reduced to 0 lines for concrete types, or 1 line if you have any interface dependencies!
  • Simple, „Fluent” API – Just because it’s „Tiny”, doesn’t mean it has no features. A simple „fluent” API gives you access to the more advanced features, like specifying singleton/multi-instance, strong or weak references or forcing a particular constructor.

Tak autor określa funkcjonalność TinyIoC. Ale co nam po długich opisach, ahah i ochach nad biblioteką. Pora na porcję kodu jak tego w ogóle użyć.

Implementacja kontenera IoC. Mięcho, czyli Inversion Of Control po polsku

Mi osobiście bardziej podchodzi implementacja bez użycia Fluent API jak również wolę używać instancji jako Singleton.
Według Wiki Singleton to

Singleton – kreacyjny wzorzec projektowy, którego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu. Niekiedy wzorzec uogólnia się do przypadku wprowadzenia pewnej maksymalnej liczby obiektów, jakie mogą istnieć w systemie[1]. Niektórzy programiści uznają go za antywzorzec, ponieważ łamie zasady projektowania obiektowego, często bywa nadużywany[2] lub sprowadza się do stworzenia obiektowego zamiennika dla zmiennej globalnej[3][4].

Prosta rejestracja interfejsu w kontenerze

FreshIOC.Container.Register<IDataService, MockDataService); //As Singleton
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance); //As Singleton

Można użyć również Fluent API do rejestracji

FreshIOC.Container.Register<IDataService, MockDataService>().AsSingleton();
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance).AsMultiInstance();

Wstrzykiwanie zależności z użyciem konstruktora i nie tylko

W 10Things używam wstrzykiwania zależności za pomocą konstruktora co według mnie jest dobrą praktyką programistyczną. Znacznie lepszą niż użycie słówka Resolve.

Przykładem na użycie może być

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel(IDataService dataService, IUserDialogs userDialogs)
{
this.dataService = dataService;
this.userDialogs = userDialogs;
}
}

Można to również zaimplementować używając słówka Resolve.

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel()
{
this.dataService = FreshIOC.container.Resolve<IDataService>();
this.userDialogs = FreshIOC.container.Resolve<IUserDialogs>();
}
}

Jak widzicie użycie kontenera IoC nie musi być skomplikowane i trudne. Można to zrobić dużo prościej, przyjemniej. Podsumowując kontenerów Inversion Of Control jest tyle co grzybów po deszczu i każdy może znaleźć coś dla siebie. Ja wolę używać czegoś co jest lekkie i ma to co jest mi obecnie potrzebne.

10Things – co dalej

Będę rozwijał kolejne funkcjonalości aplikacji. Obecnie w planach mam dodanie obsługi menu (master detail), oraz stworzenie kontrolki kalendarza from scratch lub użycie gotowej. Chociaż wszystko wyjdzie w trakcie pracy.