IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Système de plugins défaillant


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Par défaut Système de plugins défaillant
    Bonjour à tous,

    J'ai un gros problème de conception avec Visual Studio, mais après trifouillé un peu je pense que le problème dépasse les limites du simple éditer de code ...

    Voilà j'ai 2 types d'objets : les agents et les IA, chaque agent possédant au moins 1 IA (instanciation d'une des nombreuses classes IA).
    J'ai décidé de placer toutes les fonctions disponibles pour ces agents et ces IA dans des Dlls (plugins).
    Pour faciliter le chargement de ces fonctions j'ai une classe "PluginManager" qui va gérer l'ouverture / fermeture des plugins ainsi que le rapatriement des fonctions. Et puis comme ce serait bien que ce PluginManager puisse optimiser cette gestion je me suis dit que ce serait cool que ce soit un agent "un peu dégénéré" pour qu'il puisse utiliser des IA.

    Je ne sais pas si ça a son importance mais en fait sous Visual j'ai fait 2 projets (agent et IA), et mon problème est que chacun dépend de l'autre, d'où référence circulaire et problème de conception.
    Le principe est le suivant :
    - Une classe "Monde" crée le PluginManager au démarrage
    - Le PluginManager va charger ses fonctions d'IA si on lui a indiqué dans son petit fichier ...
    - Le "Monde" va créer tous les autre agents, qui vont passer par le PluginManager pour récupérer leurs fonctions (c'est un singleton au cas où)

    Mon problème vient du fait que chaque agent "a du code d'IA" dans sa méthode de chargement au démarrage, donc visual veut les liens vers ces méthodes / classes, et les IA ont "du code d'agent" dans leur méthode de chargement car elles font appel au "PluginManager", d'où référence circulaire ... et là je suis perdu.

    J'ai déjà évoqué ce sujet dans une autre section (je voulais séparer le PluginManager du projet Agent), j'ai voulu faire mon malin à l'époque (je voulais une solution en 5 min), et finalement je me trimballe toujours ce problème de conception.

    Si vous ne comprenez pas un point n'hésitez pas, si ça peut faire avancer ...
    D'avance merci
    JS

  2. #2
    Membre éprouvé Avatar de rakakabe
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    124
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 124
    Par défaut
    je ne saisis pas bien ton problème mais pour résoudre la dépendance entre projets, est-il possible de créer un 3ème projet avec les caractéristiques suivantes : il contiendrait PluginManager et les interfaces permettant d'uniformiser l'accès aux agents et aux IA, et traiter les objets IA comme des services fournis aux agents àtravers ton PluginManager ? je pense là à une solution similaire au System.ComponentModel du .Net de microsoft ...

    NB : peut-être qu'appliquer le principe de l'inversion de controle pourrait t'aider dans ton problème ;

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Par défaut
    Je ne maitrise pas tellement la notion de service, mais comme ça je dirais qu'il faut quand même inclure la librairie contenant le code du service pour pouvoir l'utiliser, donc les agents dépendent des services. Or comme les services sont là pour travailler sur des agents j'aurais toujours ma double dépendance ...

    En fait pour essayer d'expliquer un peu mieux, mon problème vient du fait que mes agents vont à un moment devoir créer les IA, donc ils ont besoin de connaitre au moins le code pour les créer (constructeur / destructeur) + le code pour travailler avec, donc j'ai une dépendance.
    D'un autre côté les IA doivent connaitre le code du PluginManager pour pouvoir aller "chercher" leurs fonctions, et connaitre le code des agents pour pouvoir travailler sur eux, donc j'ai la dépendance inverse ...

    Pour l'instant le seul moyen que j'ai trouvé c'est de mettre les éléments de base de ces classes dans le même projet (interface agent, interface IA et PluginManager), mais je trouve ça carément cradingue ...

  4. #4
    Membre éprouvé Avatar de rakakabe
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    124
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 124
    Par défaut
    Ok ok ! je vois pas comment résoudre ton problème, sinon le truc de dingue (mettre les dépendances au niveau de l'interface). Est-t-il possible de faire le truc suivant :
    puisque PluginManager est un agent, mettre l'interface Agent, PluginManager et IA dans un même projet (pour que IA puisse accéder à la signature de la méthode de l'interface agent), les différentes implémentations de Agent dans un autre projet : on supprime la création des IA dans les agents, et on déplace ainsi la référence circulaire au niveau de l'interface et non au niveau de l'implémentation. Enfin, dans le 3eme projet, on met Monde qui, à l'initialisation, crée d'abord les IA et PluginManager, et ensuite crée les autres agents en y "injectant" l'implémentation de l'IA appropriée, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Injection des IA à la création des IA
    // this représente ici l'objet Monde, 
    // getIA() retourne une référence à un objet IA 
    agent = new ImplAgent(this.getIA("nomIA"));
    // ou encore, injection quelques part dans le code, 
    // après implementation des IA
    agent.setIA(this.getIA("nomIA"));
    Tu pourras peut-être aussi faire en sorte que les agents accèdent à leur IA à travers PluginManager, au lieu de l'injection via Monde ...
    NB : j'oubliais ! Monde dépends des deux projets ...

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Par défaut
    En fait à l'heure actuelle pour avancer un peu ce que j'ai fait c'est regrouper les agents, les IA, le PluginManager et le monde dans le même projet.
    Comme ça ce projet contient toute l'architecture de base de tous mes objets.

    Ensuite toutes les évolutions et les cas "pratiques" sont déportés dans les dlls

Discussions similaires

  1. Système de Plugins "réutilisable"
    Par mctd02 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 31/10/2007, 18h54
  2. Système de plugins
    Par damien77 dans le forum C
    Réponses: 7
    Dernier message: 22/03/2007, 22h27
  3. création d'un système de plugin
    Par st20085 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 06/02/2007, 00h37
  4. Ajout d'une commande système à un plugin ?
    Par kafifi dans le forum C++
    Réponses: 11
    Dernier message: 15/07/2006, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo