2009-10-01 6 views
1

J'utilise ASP.NET MVC (1.0) et StructureMap (2.5.3), je suis en train de faire une fonctionnalité de plugin dans laquelle les DLLs avec contrôleur doivent être récupérées dans un dossier . J'enregistrer les contrôleurs avec SM (je suis en mesure de le ramasser par la suite, donc je sais qu'il est là-dedans)Contrôleurs de plugins, StructureMap et ASP.NET MVC

foreach (string file in path) 
{ 
    var assy = System.Reflection.Assembly.LoadFile(file); 
    Scan(x =>{ 
     x.Assembly(assy); 
     x.AddAllTypesOf<IController>(); 
    }); 
} 

Mon problème est la méthode GetControllerInstance de mon remplacement de DefaultControllerFactory. Chaque fois que j'envoie autre chose qu'un contrôleur valide (valide en ce sens qu'il fait partie du projet web), le paramètre Type d'entrée est nul.

J'ai essayé de configurer des routes spécifiques pour cela.

J'ai fait un test avec Castle.Windsor et là ce n'est pas un problème.

Quelqu'un peut-il me diriger dans la bonne direction? J'apprécierais.

[Modifier]

Voici le Code:

-> usine de Controller pour Windsor

public WindsorControllerFactory() 
{ 
    container = new WindsorContainer(new XmlInterpreter(
    new ConfigResource("castle"))); 
    // Register all the controller types as transient 
    // This is for the regular controllers 
    var controllerTypes = 
    from t in 
     Assembly.GetExecutingAssembly().GetTypes() 
    where typeof(IController).IsAssignableFrom(t) 
    select t; 
    foreach (Type t in controllerTypes) 
    { 
    container.AddComponentLifeStyle(t.FullName, t, 
     LifestyleType.Transient); 
    } 
    /* Now the plugin controllers */ 
    foreach (string file in Plugins()) 
    { 
    var assy = System.Reflection.Assembly.LoadFile(file); 
    var pluginContr = 
     from t in assy.GetTypes() 
     where typeof(IController).IsAssignableFrom(t) 
     select t; 
    foreach (Type t in pluginContr) 
    { 
     AddToPlugins(t); 
     /* This is the only thing I do, with regards to Windsor, 
     for the plugin Controllers */ 
     container.AddComponentLifeStyle(t.FullName, t, 
     LifestyleType.Transient); 
    } 
    } 
} 

-> StructureMap; ajouter les contrôleurs:

public class PluginRegistry : Registry 
{ 
    public PluginRegistry() 
    { 
    foreach (string file in Plugins()) // Plugins return string[] of assemblies in the plugin folder 
    { 
     var assy = System.Reflection.Assembly.LoadFile(file); 
     Scan(x => 
     { 
     x.Assembly(assy); 
     //x.AddAllTypesOf<IController>(). 
     //  NameBy(type => type.Name.Replace("Controller", "")); 
     x.AddAllTypesOf<IController>(); 
    }); 
    } 
    } 
} 

-> L'usine de contrôleur pour la version SM Pas vraiment faire beaucoup, comme je l'enregistrement des contrôleurs avec SM dans l'étape précédente

public SMControllerFactory() 
    : base() 
{ 
    foreach (string file in Plugins()) 
    { 
    var assy = System.Reflection.Assembly.LoadFile(file); 
    var pluginContr = 
     from t in assy.GetTypes() 
     where typeof(IController).IsAssignableFrom(t) 
    select t; 
    foreach (Type t in pluginContr) 
    { 
     AddPlugin(); 
    } 
    } 
} 
+0

Essayez-vous d'analyser tous les assemblys dans votre registre StructureMap ET dans votre fabrique de contrôleurs? C'est à quoi ça ressemble, mais ça n'a pas vraiment de sens. Votre registre StructureMap devrait faire tout le balayage pour enregistrer tous les types de contrôleurs dans le conteneur. L'usine du contrôleur demande alors au conteneur une instance du type de contrôleur demandé. –

Répondre

0

Pouvez-vous publier votre usine de contrôleur ?

Je ne comprends pas pourquoi Castle fonctionnerait puisque je penserais que vous obtiendriez également la valeur null pour le paramètre Type de GetControllerInstance, quelle que soit la structure DI utilisée dans cette méthode. MVC est chargé de faire correspondre le nom de la chaîne du contrôleur dans l'URL avec un type réel (sauf si vous avez outrepassé ces méthodes). Donc, je suppose que ce n'est pas le cadre DI, mais que MVC ne peut pas trouver vos classes de contrôleur pour une raison quelconque.

Questions connexes