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

Développement Windows Discussion :

Architecture logiciel avec IOC


Sujet :

Développement Windows

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut Architecture logiciel avec IOC
    Bonsoir la team, voici une question limite philosophique

    Je cherche à pouvoir utiliser des classes POCO contenues dans des DLL qui sont injectées dans mon soft (des plugin donc) via Ninject.
    J'ai créé un premier bind sur une interface IMenu qui autorise les DLL à insérer les icônes et les boutons dans la barre du menu du logiciel hôte.
    Les événements clics fonctionnent et mes DLL gèrent sans problème la gestion de la base Sqlite commune.
    Les formulaires de gestion DAO tournent (add, modif, remove, list,...) parfaitement.
    Exemple de plugin :
    Une DLL pour les contacts, une autre pour les civilités et disons une troisième pour les sociétés ou les villes. Chacune intègre une table dans la BDD commune et contient le POCO et le PocoManger d’accès à la base.
    je suis clair ?

    Voici ma question :
    Comment puis-je faire pour que la DLL société par exemple puisse lire et intégrer un contact ?
    En effet, à cause (ou grâce) à l'injection de dépendance personne ne connait personne dans le code, c'est qu'a l’exécution que les plugins sont lues. D'autant que cette architecture et faite pour pouvoir ajouter une nouvelle fonctionnalité (table ou autre) sans rien toucher, ni recompiler

    Voici mes idées, pouvez-vous me donner votre vision des choses ? D'avance merci pour vos conseils et idées.

    1. copier toutes les classes poco+pocoManager dans une DLL commune à la solution pour que chaque plugin puisse les utiliser. (à re-distribuer à chaque ajout de plugin :/)
    2. créer une interface pour chaque POCO dans le prog hôte ? (nécessite de recompiler le prog à chaque ajout de plugin donc pas malin malin)
    3. copier les Poco utile dans les DLL qui en auront besoin (pareil si je modifie un POCO faut tout recopier et recompiler :/ )
    4. à vrai dire je sèche pour les autres idées, style injecter dans les plugins un plugin (idem niveau compilation global et surtout je risque des injections circulaires et puis ajouter une forte dépendance et loin d'être la solution à mon sens)

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    un peu de code pour que voyez ou j'en suis :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                // Dans le MAIN : lecture du répertoire des dll plugins
                Kernel.Load("plugins/*.dll");
     
                // renseigne la liste des plugins trouvés IMenu
                listeMenus = Kernel.GetAll<IMenu>().ToList();
                // archive la list des plugins trié par ordre de chargement selon le prédicat Ipluging.ordre (linq)
                listeMenus = listeMenus.OrderBy(e => e.ordre).ToList();
    // ok
    // test concluant mais je ne vois pas trop quoi en faire puisque je ne peux pas m'en servir dans le code (c'est la que ma compréhension de l'IOC touche à l’incompréhension ^^ )
                // liste des tables.
                listeTables = Kernel.GetAll<ITable>().ToList(); //ITable ne contient que ID et NOM donc pas super utile
                // liste des Managers.
                listeManagers = Kernel.GetAll<ITableManager<ITable>>().ToList(); // toujours vide ne trouve pas les manager BDD
     
                Application.Run(new Form1());

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    En attendant vos idées, je me lance dans la solution 1 qui me semble efficace et maintenable.
    @++

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    Hmm si j'ai bien compris tu cherches a faire interagir des plugins entre eux c'est bien ca ?

    Dans, ce cas je partirai sur la solution suivante ( qui n'est pas forcement la meilleure) :
    • Chaque plugin implentente une interface (logique)
    • Chaque methode de plugin peut lancer des evenements (possible)
    • Ton programme maitre recupere ces evenements
    • Et appelles d'autres plugins en consequence => tu va devoir ici faire un mapping entre evenement plugin1 et action plugin2 (statique dans le code, ou dynamique via un backoffice par exemple).


    Avec cette solution, ca devrai le faire, tu restes full plugin et propre (pas de copie de dll), pas de recompile etc (par contre c'est pas intuitif et bonjour le debug).

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    En effet tu as tout bon, c'est pourquoi j'opte pour la solution de la DLL commune à tous les plugins.
    C'est facile à maintenir, elle contient les classes poco, manager et la gestion de la BDD.
    une simple référence, un résoudre et hop chaque plugins connait et peut utiliser les poco des autres plugins
    Dans l'attente de poursuivre cette conversation je continu sur cette voie qui semble convenir.
    Bien cordialement ADN

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/05/2015, 08h52
  2. [Élaboration] architecture logicielle avec bdd.besoin de conseils
    Par yetpa dans le forum Architecture
    Réponses: 1
    Dernier message: 06/09/2009, 17h54
  3. [FLASH] Interface logiciel avec Flash
    Par YanK dans le forum Flash
    Réponses: 2
    Dernier message: 16/08/2005, 20h01
  4. Qu'est ce qu'une architecture logicielle?
    Par car dans le forum Architecture
    Réponses: 1
    Dernier message: 11/11/2004, 17h23
  5. TDBChart et liaison logicielle avec une table ?
    Par Mailgifson dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/07/2004, 14h11

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