2009-08-04 5 views
0

J'écris une application qui supporte les plugins. Le créateur de plugin est responsable de fournir des instances aux plugins qu'il crée. Il existe deux alternatives pour fournir ces instances.Laquelle est la meilleure approche pour fournir des instances aux plugins?

Option 1: écrivain Plugin écrit ses plugins comme ceci:

public interface IGiveMe1 { INeed1 Need1 { set; } } 

public interface IGiveMe2 { INeed2 Need2 { set; } } 

public class MyPlugin : IGiveMe1, IGiveMe2 
{ 
    // This has to be parameterless 
    MyPlugin() { ... } 

    #region IGiveMe1 Members 

    public INeed1 Need1 { set { ... } } 

    #endregion 

    #region IGiveMe2 Members 

    public INeed2 Need2 { set { ... } } 

    #endregion 
} 

Après le créateur du plugin crée l'instance en utilisant le constructeur parameterless obligatoire, il cherche des interfaces qui implémente la classe plugin. Si plugin implémente IGiveMe1, le créateur du plugin appelle setter de INeed1. Idem pour IGiveMe2.INeed2.

Option 2: écrivain Plugin écrit ses plugins comme ceci:

public class MyPlugin 
{ 
    MyPlugin(INeed1 need1, INeed2 need2) 
    { 
     ... 
    } 
} 

Dans cette méthode, le plugin recherche créateur pour les constructeurs qui prennent des paramètres de type INeed1 et INeed2. Il trouve la meilleure correspondance (celle avec les paramètres les plus correspondants) et l'appelle en passant les instances.

Si vous deviez écrire des plugins pour cette application, quelle approche préférez-vous?

Répondre

0

Je préfère nettement la deuxième option, car elle est beaucoup plus simple et plus claire. Les tests unitaires pour les plugins seront aussi plus clairs. Alternativement, si vous ne voulez pas passer tous les INeedX à tous les plugins, faites correspondre le type des paramètres constructeurs (en utilisant évidemment la réflexion) et ne passez que ceux qui sont acceptés dans le constructeur.

Questions connexes