Bon ca n'a pas l'air d'emballer grand monde mon histoire.... :(
J'ai trouvé une solution alternative, le but est d'attaquer le service correspondant sans connaitre le type d'entité.
J'ai supprimé la méthode public GetService, et mon provider reprend tout les méthode des services (ici pour l'exemple, la méthode Save(Entity entity), dans le cas d'une méthode sans paramètre, (par ex GetNew()), on lui passe le type en paramètre (Entity GetNew(Type entityType))
Le fournisseur de service a donc cette tete maintenant et ca marche, en utilisant la rélfexion.
Si vous avez une solutions plus propres... je suis preneur
static class Program
{
[STAThread]
static void Main()
{
// Création de l'entité
User oUser = new User();
// Sélection du service d'accès aux données
ServiceProvider.Save(oUser);
}
}
public static class ServiceProvider
{
public static void Save(Entity entity)
{
if (entity == null)
throw new ArgumentException("L'entité ne peut être nulle");
ExecuteService(entity.GetType(), "Save", new object[] { entity });
}
private static object ExecuteService(Type entityType, string methodName, object[] parameters)
{
// Sélection du service
object oService = GetService(entityType);
// Sélection de la méthode
Type oServiceType = oService.GetType();
MethodInfo oMethod = oServiceType.GetMethod(methodName);
// Execution et retour de la valeur
object oValue = oMethod.Invoke(oService, parameters);
return oValue;
}
/// <summary>
/// Retourne le service en fonction du type d'entité donné
/// </summary>
/// <returns>IEntityService</returns>
private static object GetService(Type entityType)
{
if (entityType == null)
throw new ArgumentException("Le type ne peut pas etre null");
else if (!entityType.IsSubclassOf(typeof(Entity)))
throw new ArgumentException("Le type doit etre un entité");
else if (entityType.Equals(typeof(Content)))
return new ContentService();
else if (entityType.Equals(typeof(User)))
return new UserService();
else
throw new ArgumentException("Ce type d'entité n'a pas de service attribué");
}
}
Nico