Artykuł

freeimages.com freeimages.com
sie 23 2016
0

Autofac w Xamarin.Forms

Mechanizm DependencyService zaprezentowany w poprzednim wpisie, daje sporo możliwości już na starcie pracy z Xamarin.Forms. Dzięki zastosowaniu specjalnego atrybutu, możemy korzystać z funkcjonalności opisanych w paradygmacie IoC praktycznie bez żadnego wysiłku i mamy ten mechanizm dostępny out-of-the-box.

Prostota rozwiązania niesie za sobą też pewne skutki uboczne. Mechanizm jest niezwykle łatwy w użyciu, ale zarazem bardzo ograniczony funkcjonalnie. Jeśli kiedykolwiek pracowaliście z kontenerami IoC typu Autofac, czy Ninject, to szybko przekonacie się, że DependencyService tak naprawdę oferuje nie wiele.

Nie możemy w prosty sposób określić czy usługa ma być rejestrowana jako pojedyncza instancja, na żądanie, czy może też ma zawsze zwracać ten sam obiekt w określonym obszarze aplikacji. Nie mówię już tutaj również o bardziej złożonych operacjach, typu rejestracja usługi ze zdefiniowanymi wartościami parametrów itp. itd.

Czy zatem warto korzystać ze standardowego rozwiązania? Być może w prostych aplikacjach może i tak, ale ogólnie zachęcam do wyboru bardziej zaawansowanych bibliotek. Na szczęście takowe można bardzo łatwo podpiąć do Xamarin.Forms:-)

Autofac - krótko o kontenerze

Autofac to jeden z najpopularniejszych kontenerów IoC dostępnych w świecie .Net Frameworka. W ostatnich tygodniach doczekał się w końcu długo oczekiwanej wersji stabilnej 4.0.0, która wprowadza m.in. wsparcie dla .Net Core, UWP, czy też .NET Standard Library. Od pewnego czasu z tym ostatnim rozwiązaniem zgodny jest również sam Xamarin.

Autofac zapewnia sporą liczbę opcji samej rejestracji serwisów, a także ich pobierania (resolve). W przeciwieństwie do wbudowanego w system rozwiązania, daje nam również większą kontrolę, nad tym co rzeczywiście w naszej aplikacji się aktualnie dzieje, a także jak i kiedy obiekty są niszczone.

Autofac w Xamarin.Forms - jak zacząć?

Pracę z Autofaciem w Xamarin.Forms, zaczynamy standardowo od Nugeta, a konkretniej od instalacji paczki Autofac.Extras.CommonServiceLocator/, która w zależnościach ma dowiązania do bazowej biblioteki Autofaca, a także do nugeta CommonServiceLocator, który przechowuje interfejsy i usługi, które można użyć do odnajdywania usług za pomocą kontenerów IoC. Oczywiście w projekcie powinny znajdować się również wszystkie niezbędne paczki dla Xamarin.Forms, ale takowe są automatycznie dodawane przy tworzeniu nowych projektów:) Warto jedynie pomyśleć o ich aktualizacji.

W kolejnym kroku musimy skonfigurować Autofaca do pracy z Xamarin.Forms. Najlepiej zrobić to jak najwcześniej, dlatego dobrym miejscem może być konstruktor naszej klasy dziedziczącej z Application, bądź też metoda OnStart. Poniżej cały potrzebny kod:

// Initialize Autofac builder
var builder = new ContainerBuilder();

// Register services
// builder.RegisterType<NavigationService>().As<INavigationService>().SingleInstance();
// TODO add your services or load modules

// Setup Autofac 
var container = builder.Build();
AppContainer.Container = container;
ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(container));

Ten krótki listing kodu, wystarcza by móc korzystać z możliwości Autofaca w Xamarin.Forms. Oczywiście w miejscu TODO należy wpisać wszystkie rejestracje swoich usług. Warto również zauważyć, że w Autofacu możemy korzystać z modułów. Dzięki temu łatwiej będzie stworzyć bardziej modularny kod.

Stosując Autofaca, warto również rozważyć problem Lifetime scope. Osobiście scope określam na poziomie strony w Xamarin.Forms, co wymaga pewnego, dodatkowego kodu oraz odpowiedniego procesu sprzątania.

W podobny sposób można podpiąć dowolny inny kontener, który posiada wsparcie dla rozwiązania CommonServiceLocator.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus