décembre
2014
PCL = Portable class Library
Pour pouvoir dans un projet PCL accèder aux API d’un système, il faut utiliser un système de dépendances.
Vous avez plusieurs solutions liées à des interfaces ou à des classes abstraites/virtuelles aux choix
- Créer une classe avec des références sur des classes implémentant des interfaces
- Utiliser le DependencyService de Xamarin pour plateforme mobile référencant la librairie Xamarin
- Créer votre propre DependencyService multi plateforme
Je privilégie la solution 1 et 3. La solution DependencyService de Xamarin ne me plaît pas car elle ne fonctionne pas pour les projets PC.
Je vous expose donc la solution 1 et 3.
Solution 1 avec une classe et un sorte de singleton renseigné par l’application cible (et non par sa propre classe):
{
private static IO _current = null;
public static IO Current
{
get { return _current; }
set { _current = value; }
}
public virtual bool FichierExiste(string cheminFichier)
{
return false; // Vous pouvez aussi lever une exception pour indiquer que le code n'a pas été implémenté
}
}
public class IOiOS : IO
{
public override bool FichierExiste(string cheminFichier)
{
return File.Exists(cheminFichier);
}
}
pour l’utiliser, il suffit de faire un
IO.Current = new IOiOS();
puis dans le PCL : IO.Current.FichierExiste(« image.png »);
Solution 3
Créer votre propre DependencyService
using System.Text;
using System.Threading.Tasks;
namespace Aktaour.Core.Framework
{
public class DependencyInjector
{
private static DependencyInjector _instance = null;
private Dictionary<Type,Type> _dependencyList = new Dictionary<Type,Type>();
public static DependencyInjector Instance
{
get
{
if (_instance == null)
_instance = new DependencyInjector();
return _instance;
}
}
public void Register<TBase,T>() where T : TBase
{
if (_dependencyList.ContainsKey(typeof(TBase)))
throw new Exception("Type already register");
else
_dependencyList.Add(typeof(TBase), typeof(T));
}
public TBase Get<TBase>()
{
if (_dependencyList.ContainsKey(typeof(TBase)))
{
return (TBase)Activator.CreateInstance(_dependencyList[typeof(TBase)]);
}
else
return default(TBase);
}
}
}
Dans le projet PCL créer une classe IO
{
public virtual bool FichierExiste(string cheminFichier)
{
return false; // Vous pouvez aussi lever une exception pour indiquer que le code n'a pas été implémenté
}
}
Et dans votre application iOS créer une classe IOiOS
{
public override bool FichierExiste(string cheminFichier)
{
return File.Exists(cheminFichier);
}
}
et enregistrer votre classe dans le DependencyInjector
Ensuite, pour créer vos objets, vous utilisez le DependencyInjector via la classe de base
Pour finir, il suffit d’être inventif pour coller au plus à vos besoins.
Commentaires récents
- Mono for Android dans
- Mono for Android dans
- [Mono]Asynchrone Mon meilleur ennemi dans