Migration d’une application vers Xamarin 2/2

Auteur du billet de blog : Rudy Spano - Neotech Solutions

Rudy Spano

Consultant .Net
  Publié le mardi 6 septembre 2016

Expert technique .Net passionné par tout ce qui est innovant en environnement Microsoft. De la mobilité, du client lourd (Xaml Applications) mais aussi une petite pointe de Web...

Contexte

Après vous avoir présenté l’environnement Xamarin/Xamarin Forms, le but de cet article est de vous synthétiser quelques unes des problématiques que j’ai pu rencontrer ainsi que les solutions et leçons que j’en ai tirées.

Le but n’est pas de détailler mon application top secrète :) mais de lister quelques conseils génériques qui sont applicables à toute création d’application Xamarin Forms ou migration d’application XAML vers Xamarin.Forms dans notre cas. 

 

Par où commencer ?

Tout d’abord, il faut établir un plan d’action.

Comme pour toute opération de portage, je vous déconseille fortement de copier tout le code (classes voire projets) d’une solution vers l’autre.

En effet, même si l’on reste dans le monde du .Net, il ne faut pas être trop optimiste sur la complexité de la tâche…

Certaines portions de code resteront intactes, d’autres devront être adaptées et d’autres devront être complétement redéveloppées…

Donc, si vous ne voulez pas vous retrouver avec des milliers d’erreurs à corriger en même temps à l’aveugle, je vous conseille d’identifier les différents types de code à porter.

Notre point d’entrée étant une « Xaml Based App » à base de MVVM avec du code métier isolé dans une assembly, ma stratégie a été la suivante :

L’idée est d’être capable de compiler la solution le plus rapidement et souvent possible afin de ne pas « se noyer » en traitant tous les problèmes de toute nature en même temps…

Bien sûr, si le projet « Xaml Based App » que vous souhaitez migrer n’est pas bien architecturé, mieux vaut repasser dessus dans un premier temps si vous souhaitez en faire quelque chose…

La stratégie a aussi été de se concentrer sur les « Key features » quitte à mettre de côté/bouchonner certaines parties du code moins importantes nécessitant un effort d’adaptation.

 

Migration du code métier

Créons tout d’abord notre assembly métier.

Xamarin propose de créer des Class Library en mode PCL (Portable Class Library).

Ce type de projet peut être ajouté à la solution via le menu Add -> New Project -> Cross Platform-> Class Library (Xamarin.Forms)

 

Remarquez dans les propriétés du projet la compatibilité avec différentes technologies .Net

 

La couche métier de l’application que j’ai souhaité migrer est en PCL mais n’est pas compatible avec Xamarin. Dans le cas contraire, il aurait été envisageable d’utiliser/référencer directement cette couche sans avoir à la recréer.

Notons que Microsoft a récemment créé la spécification .Net Standard afin d’assurer que les librairies portables créées avec les nouvelles technologies puissent être utilisées de part et d’autre (UWP, ASP.Net Core, Xamarin, …).

 

Lors de la migration, le code métier s’est avéré en grande partie compatible :

  • DTO (Data Transfert Object) 
  • Helpers 
  • Providers : 100% compatibles dans mon cas. Ce sont des classes qui :
    • appellent des webservices REST via System.Net.Http.HttpClient
    • font de la sérialisation/désérialisation Json via NewtonSoft

Il a été par contre nécessaire de réécrire les parties de code utilisant du code spécifique aux applications SL WP/Windows Store/UWP :  

  • Les classes utilisant des paramètres applicatifs utilisant l’isolated storage (LocalSettings/RoamingSettings).

                =>Solution : Chaque plateforme gérée par Xamarin propose des mécanismes différents pour stocker ce type de paramètres… Pas de panique, il y’a une communauté qui développe avec Xamarin avec un pas mal de librairies Open-Source ! Dans notre cas de figure, j’ai utilisé le paquet nuget Xam.Plugins.Settings qui me permet de gérer les settings en toute simplicité :

 

  • Les classes utilisant des ressources (fichiers, images, etc…) du projet

                =>Solution : Xamarin permet de lire un fichier (au format texte ou autre)  en toute simplicité. Il suffit de l'ajouter au projet et de le configurer en EmbeddedResource (propriétés -> Build Action) :

 

Migration des ViewModels

Le design pattern MVVM  est le pattern de référence pour les applications XAML. Les View-Models servent de liaison bi-directionnelle entre nos Models issus de notre couche métier et nos vues.

Il existe plusieurs librairies qui fournissent des classes permettant de simplifier la mise en place de ce pattern.

De mon côté, j’ai une préférence pour la librairie réputée : MVVMLight qui fournit avec très peu d’effort d’implémentation les mécanismes suivants :

                -ViewModelLocator:  Permet de lier une View à son ViewModel en Xaml.

                -RelayCommand et RelayCommand<T>: Mécanisme pour exécuter du code côté ViewModel suite à une commande déclenchée par l’UI via le DataBinding.

                -IOC : MVVMLight propose un mécanisme simple et efficace d’inversion de contrôles via de l’Injection de Dépendances ou du Service Locator.

Bref, la bonne nouvelle c’est que MVVMLight est aussi compatible avec Xamarin Forms !

Si tous vos ViewModels respectent bien le pattern comme c’est le cas dans mon application à porter, ceux-ci peuvent être portés sans aucune modification dans le code !

Si vous souhaitez porter l’une de vos applications dans laquelle vos ViewModels référencent des Namespaces spécifiques à SL WP/WinStore/UWP, je vous encourage à déporter ces logiques ailleurs avant la migration.

  

Migration XAML

La migration des UI XAML est malheureusement l'étape la plus compliquée…

Comme évoqué dans mon précédent billet, le copier-coller de XAML d’une plateforme à l’autre est loin de fonctionner.

Je vous rappelle que nous n’avons pas de designer/previewer pour voir l’impact des modifications du XAML sur le rendu ou tout simplement voir si le code XAML fonctionne.

La première chose à vérifier est que la compilation du XAML est bien activée. Cette option existe depuis peu :

Cette option peut-être aussi activée par vue. Plus d’infos ici.

Je vous conseille de migrer->adapter->valider vos vues partie par partie. En effet il est encore difficile de fixer les erreurs du XAML. Dans la plupart des cas on se retrouve avec ce genre d’erreurs au runtime difficiles à exploiter :

Migration XAML: laissons parler le code !

Heureusement, au fur et à mesure l’expérience de développement rentre!

Vous trouverez ci-dessous des snippets de code assez incontournables pour quelqu’un qui souhaite développer en Xamarin Forms :

 

Page – UserControls => ContentPage – ContentView

 

  • Tous les fichiers XAML doivent être ajoutés au projet en Embedded Resource (fait par défaut en passant par le menu Add New Item->Visual C#->Cross-Platform->Forms Xaml Page).

 

Les layouts

 

  • Vous trouverez un équivalent à la quasi-totalité des contrôles conteneurs que vous utilisez en XAML.

 

Les alignements et tailles

 

  • Petit piège dans lequel il est difficile de ne pas tomber. Si à certains endroits de votre application vous avez défini des tailles explicitement : Height, Width: il faudra en Xamarin.Forms les définir via les propriétés HeightRequest/WidthRequest. En effet les propriétés Height/Width existent bien mais elles sont Read-Only (=>Exceptions au Runtime) et correspondent aux tailles courantes une fois le rendu fait par l’UI (équivalent des ActualHeight/ActualWidth en «XAML classique »).
  • Xamarin.Forms a choisi de renommer les XXAlignements en XXOptions (HorizontalOptions/VerticalOptions). Ces propriétés proposent des valeurs d’alignements équivalentes à celles existant (Start=Left/Top, End=Right/End, …)  mais aussi des valeurs avec suffixe XXAndExpand qui « occupent » l’espace disponible comme vous pouvez le voir dans le rendu XAML associé à notre exemple :

 

Formulaires et DataBinding

 

  • La plupart des contrôles de formulaire sont disponibles dans Xamarin.Forms même s’ils n’ont pas le même nom. Notons cependant l’absence des cases à cocher (Checkbox et RadioButton) dans la version actuelle… Mais, pas de panique car un grand nombre de librairies de contrôles dispos sous Nuget pallient ce manque (ou cet oubli ?).
  • Il est possible d’utiliser les styles (styles par défauts et styles avec clé explicite) pour garder votre XAML lisible et mutualiser les propriétés.
  • Le DataBinding fonctionne lui aussi de façon similaire (modes OneWay, TwoWay, OneWayToSource, Converters, …).

 

Les Images

 

  • La façon la plus simple d’afficher une image ajoutée au projet en « Embedded Resource » est d’utiliser une MarkupExtension XAML.

 

 

  • Si vous souhaitez créer un bouton image, le contenu d’un élément bouton ne peut-être qu’un texte (et non pas un Content comme à l’accoutumée). Une solution est d’utiliser les GestureRecognizer qui sont d’ailleurs affectables à la plupart des contrôles XAML.

 

Listview, GridView, …

 Xamarin Forms fournit de base un contrôle Listview que les développeurs ont tendance à éviter pour différentes raisons :

  • Rendu lent selon la complexité des lignes
  • Problème de gestion mémoire
  • Limitations en termes de layouts (Pas de contrôle ou mode GridView disponible)

Afin d'éviter ces problématiques, la communauté a mis à disposition plusieurs contrôles.

De mon côté, j’ai choisi d’utiliser FlowListView disponible sous Nuget pour sa facilité d'utilisation.

 

Conclusion

Je suis passionné depuis quelques années par la mobilité en environnement .Net.

Il y’a eu de nombreuses évolutions dans ce domaine au fil du temps: développement WPF pour tablettes tactiles -> SL WP7 -> SL WP8/8.1 -> WinRT ->Universal App -> UWP. De plus en plus d’appareils sont supportés aujourd’hui : PC, Tablettes, Phone, Xbox, IOT (Raspberry PI), Hololens, ...

Cependant, il est dommage de se limiter aux device sous Windows compte tenu du fait que la majorité des utilisateurs utilisent des smartphones et/ou tablettes sous Android ou IOS.  

Lorsque Xamarin, à cause de son prix de licence, s’éliminait d’office comme solution pour nous développeurs .NET de développer des applications là où il y’a cette majorité de consommateurs d’applications, Microsoft bouleverse la donne avec le rachat et la mise à disposition gratuite de l’environnement !

Ce sujet de migration d’App m’a permis de me faire une idée plus précise de ce que c’est que de développer avec l’environnement Xamarin. Il s’avère que la technologie bien que manquant de maturité évolue constamment et surtout de façon prometteuse !

Je conclurai sur 3 principaux avantages qui font pour moi sa force:

  • Xamarin trouve vraiment sa place dans le monde Microsoft .Net. => IDE, code, PCL, .Net Standard, ... : la technologie ne dépaysera pas les développeurs .Net et son évolution constante tend à renforcer cette proximité !
  • La communauté. => Force est de constater, lorsque l’on développe, qu’une véritable communauté se forme sur la technologie. A ma surprise, on trouve beaucoup de contenu sur les blogs, des solutions sur StackOverflow, des projets Open Source pour étendre les capacités de Xamarin.
  •  Xamarin pour des applications réellement multi-plateformes. => La technologie propose de nombreux mécanismes avancés pour créer une réelle application hybride qui, en plus de se lancer sur différentes plateformes, s’y adapte. Me limitant à Android pour l’instant, je n’en ai pas parlé mais ils existent :

Commentaires

Ecrit par JasonteardZL, jeudi 6 avril 2017

Последние новости здесь <a href=http:\/\/kfaktiv.ru\/>kfaktiv.ru\/<\/a>

Ecrit par AurelioqwebafYF, lundi 10 avril 2017

У вашего сайта нет ТИЦ и посещаемости? Это не беда, предлагаем уникальную услугу по подъему ТИЦ и посещаемости сделать заказ и ознакомится с услугой вы можете у нас на сайте <a href=http:\/\/progoni-xrumer.ru>progoni-xrumer<\/a> Так же вы можете зарегистрировать самый надежный и недорогой хостинг <a href=http:\/\/progoni-xrumer.ru\/hosting.html>недорогой хостинг для ваших сайтов<\/a> И зарегистрировать RU по 90р. <a href=http:\/\/progoni-xrumer.ru\/domen.html>RU домены за 90 рублей<\/a> Заказать <a href=http:\/\/progoni-xrumer.ru>прогон хрумером<\/a> здесь.

Ecrit par JacobnamWR, vendredi 14 avril 2017

Вспомоществование PHP и MySQL <a href=https:\/\/prohoster.info\/server\/dts-prohoster>аренда сервера<\/a> В предвестие впоследствии остальных бесплатных хостингов мы поддерживаем PHP и MySQL без ограничений. Вы получите образцовый доступ к последним версиям PHP и MySQL. Авто-Установщик Скриптов. <a href=https:\/\/prohoster.info\/server\/dts-prohoster>аренда сервера<\/a> Только маломальски кликов и Вы сможете установить Wordpress, Joomla, форумы и многое другое. Профессиональный и обыкновенный функциональный сайт создастся для считанные минуты. Пропали наивность проще!

Ecrit par PatrickwhiskOX, mardi 18 avril 2017

Отличное <a href=https:\/\/prohoster.info\/server\/dts-vinnitsa>выделенный сервер<\/a> общество для тех, кому нужен безопасный сервер заранее постинг (Хрумер, A-Poster, ZennoPoster). У нас поглощать серверы, расположенные в столице Украины, Киеве, где Вы можете отведывать назначенный софт без проблем и забот. Начисто серверы имеют выделенное гарантирование подключение к 100Мбит\/с портам и неизмеримый трафик. Конечно, бесплатная разночтения ОС Windows включена в тарифы. Ради определенный момент это <a href=https:\/\/prohoster.info\/server\/dts-vinnitsa>выделенный сервер<\/a> лучшее приговор для такого типа софта.

Ecrit par BradleyAcankIO, dimanche 23 avril 2017

OpenVZ — спор <a href=https:\/\/prohoster.info\/vps\/ssd-vps>vds хостинг<\/a> технологии виртуализации дабы уровне операционной системы, которая базируется чтобы ядре Linux. OpenVZ позволяет дабы одном физическом сервере ульнуть <a href=https:\/\/prohoster.info\/vps\/ssd-vps>vds хостинг<\/a> громада изолированных копий операционной системы, называемых «виртуальные частные серверы» (Arranged Obscured Servers, VPS) alias «виртуальные среды». Основные отличия OpenVZ после KVM заключается в диссертация что ресурсы предоставленные соответствие тарифу дозволено расширить в всякий момент без перезагрузки сервера, а единовластно же, установк ОС (операционной системы) занимает меньше времени.

Ecrit par Tia, lundi 24 avril 2017

I seriously love your site.. Very nice colors & theme. Did you build this web site yourself? Please reply back as I\'m wanting to create my very own blog and would love to find out where you got this from or just what the theme is called. Thanks!

Ecrit par Bridgette, mardi 25 avril 2017

Hi there! I could have sworn I\'ve been to this site before but after reading through some of the post I realized it\'s new to me. Anyways, I\'m definitely glad I found it and I\'ll be book-marking and checking back often!

Ecrit par Luciana, mercredi 26 avril 2017

I like the valuable information you provide in your articles. I\'ll bookmark your weblog and check again here regularly. I am quite certain I will learn a lot of new stuff right here! Best of luck for the next!

Ecrit par JosephDowER, mercredi 26 avril 2017

Женский журнал здесь <a href=http:\/\/laform.ru\/>laform.ru<\/a>

Ecrit par ManuelmubGL, vendredi 28 avril 2017

Конструктор сайтов – это профильный <a href=https:\/\/prohoster.info\/hosting\/constructor>конструктор сайтов магазинов<\/a> онлайн сервис, позволяющий давать и соединять веб-страницы в целостную структуру – сайт и исправлять им, не обладая специальными техническими знаниями. Файлы <a href=https:\/\/prohoster.info\/hosting\/constructor>конструктор сайтов магазинов<\/a> созданного сайта размещены в облачном депо – хостинге, стабильность и безопасность работы которого поддерживается командой администраторов ресурса.

Ecrit par BrandontiemoBS, samedi 29 avril 2017

Предоставляет <a href=http:\/\/sb9443.ru\/>по ссылке<\/a> широкий спектр банковских услуг. Часть Сбербанка в общем объёме активов российского банковского сектора составляла ради 1 января 2016 возраст 28,7 %. Для рынке частных вкладов — 46 %. Кредитный бумажник соответствовал 38,7 % всех выданных кредитов населению.

Ecrit par StephenPexHO, dimanche 30 avril 2017

Новая информация о строительстве <a href=http:\/\/distroy.ru\/>distroy.ru<\/a>

Ecrit par BlakecloubMU, lundi 8 mai 2017

Самый лучший женский журнал здесь <a href=http:\/\/zdorovaya-life.ru\/>zdorovaya-life.ru<\/a>

Ecrit par MichaelgerUE, samedi 13 mai 2017

Самые лучшие рецепты здесь <a href=http:\/\/cakeblog.su\/>cakeblog.su<\/a>

Ecrit par Nnerjstalv61fFY, mardi 23 mai 2017

Компания «НержСталь» — многопрофильное коммерческое начинание с мощной производственной базой, которое более 10 лет осуществляет производство, установку, образование и продажу высококачественных труб и ограждений из нержавеющей стали, ограждения лестниц, металлических архитектурных и интерьерных компонентов широкого диапазона. В комплекс услуг, предоставляемых компанией своим клиентам, входят: дизайн, проектирование, монтаж и установка металлических ограждений, комбинированных модулей ограждения сообразно индивидуальным заказам, устройство торгового и ресторанного оборудования, а также <a href=http:\/\/nerjstal.pp.ua\/%d0%bd%d0%b0%d1%88%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b\/%d0%bf%d0%be%d0%bb%d0%be%d1%82%d0%b5%d0%bd%d1%86%d0%b5%d1%81%d1%83%d1%88%d0%b8%d1%82%d0%b5%d0%bb%d0%b8-%d0%b8%d0%b7-%d0%bd%d0%b5%d1%80%d0%b6%d0%b0%d0%b2%d0%b5%d0%b9%d0%ba%d0%b8\/%d0%bf%d0%be%d0%bb%d0%be%d1%82%d0%b5%d0%bd%d1%86%d0%b5%d1%81%d1%83%d1%88%d0%b8%d1%82%d0%b5%d0%bb%d1%8c-%d0%b2%d0%be%d0%b4%d1%8f%d0%bd%d0%be%d0%b9-%d0%b8%d0%b7-%d0%bd%d0%b5%d1%80%d0%b6%d0%b0%d0%b2>полотенцесушитель водяной из нержавейки классик профиль<\/a>. Мы предлагаем нашим заказчикам прочные, надёжные и красивые ограждения, лестницы из нержавейки, которые устанавливаются в многоэтажных помещениях и двухъярусных квартирах, ограждения балконов, ограждения кровли (крыши), отделанные стеклом разве пластиком, <a href=http:\/\/nerjstal.pp.ua\/%d0%bd%d0%b0%d1%88%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b\/%d1%84%d1%83%d1%80%d0%bd%d0%b8%d1%82%d1%83%d1%80%d0%b0-%d0%be%d0%b1%d0%be%d1%80%d1%83%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b0%d0%b3%d0%b0%d0%b7%d0%b8%d0%bd%d0%b0-%d0%b8%d0%b7-%d0%bd>фурнитура оборудования магазина из нержавейки казатин<\/a>, козырьки и навесы из нержавейки, внешние и внутренние ограждения из стекла. Лестницы из нержавейки удобны и практичны, монтаж этих конструкций занимает капля времени, а чужой очертание гармонично вписывается в самые современные интерьеры.

Ecrit par CurtisRewVU, jeudi 25 mai 2017

Последние женские новости здесь <a href=http:\/\/logwoman.ru\/>logwoman.ru<\/a>

Ecrit par BrianAgeryUO, lundi 29 mai 2017

Женский онлайн журнал <a href=http:\/\/malipuz.ru\/>malipuz.ru<\/a>

Ecrit par IsmaelSueldZL, mercredi 7 juin 2017

Новая информация о компьютерном железе <a href=http:\/\/www.hardexpert.net\/>www.hardexpert.net<\/a>

Ecrit par BrianzesDH, jeudi 8 juin 2017

Много информации о строительстве на даче <a href=http:\/\/sovet-sadovody.ru>sovet-sadovody.ru<\/a>

Ecrit par SvetaNorKL, vendredi 9 juin 2017

Всем привет.

Ecrit par ozizoqibafgu, dimanche 11 juin 2017

http:\/\/100mgcheapest-price-viagra.com\/ - 100mgcheapest-price-viagra.com.ankor <a href="http:\/\/tadalafil-buy-5mg.com\/">tadalafil-buy-5mg.com.ankor<\/a> http:\/\/20mgprednisone-order.com\/

Ecrit par omugomawfiako, dimanche 11 juin 2017

http:\/\/100mgcheapest-price-viagra.com\/ - 100mgcheapest-price-viagra.com.ankor <a href="http:\/\/tadalafil-buy-5mg.com\/">tadalafil-buy-5mg.com.ankor<\/a> http:\/\/20mgprednisone-order.com\/

Ecrit par ojicakarat, lundi 12 juin 2017

http:\/\/100mgcheapest-price-viagra.com\/ - 100mgcheapest-price-viagra.com.ankor <a href="http:\/\/tadalafil-buy-5mg.com\/">tadalafil-buy-5mg.com.ankor<\/a> http:\/\/20mgprednisone-order.com\/

Ecrit par idafwoqe, lundi 12 juin 2017

http:\/\/100mgcheapest-price-viagra.com\/ - 100mgcheapest-price-viagra.com.ankor <a href="http:\/\/tadalafil-buy-5mg.com\/">tadalafil-buy-5mg.com.ankor<\/a> http:\/\/20mgprednisone-order.com\/

Ecrit par ilexuyepix, lundi 12 juin 2017

http:\/\/100mgcheapest-price-viagra.com\/ - 100mgcheapest-price-viagra.com.ankor <a href="http:\/\/tadalafil-buy-5mg.com\/">tadalafil-buy-5mg.com.ankor<\/a> http:\/\/20mgprednisone-order.com\/

Ecrit par acuboxumoanel, mercredi 14 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par aiwufona, mercredi 14 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par eqabunoabo, mercredi 14 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par odaayambzoy, mercredi 14 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par betulcacabi, mercredi 14 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par uanriwuwo, vendredi 16 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par ohiydneucvog, lundi 19 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par uknotalaga, lundi 19 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par iqedexoten, mardi 20 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par ewevamoqax, jeudi 22 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par ipivadocrago, jeudi 22 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/

Ecrit par ahocopira, vendredi 23 juin 2017

http:\/\/100mg-viagracanada.com\/ - 100mg-viagracanada.com.ankor <a href="http:\/\/sertralinezoloftonline.com\/">sertralinezoloftonline.com.ankor<\/a> http:\/\/20mg-tadalafil-lowest-price.com\/