2009-10-01 5 views
1

Я использую ASP.NET MVC (1.0) и StructureMap (2.5.3), я делаю плагин, где dll с контроллером должны быть собраны в папку , Зарегистрировать контроллеры с SM (я могу забрать его после этого, так что я знаю, что это там)Контроллеры плагинов, StructureMap и ASP.NET MVC

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

Моя проблема заключается в методе GetControllerInstance моего переопределение из DefaultControllerFactory. Каждый раз, когда я отправляю в enything else, чем действительный контроллер (действительный в том смысле, что он является частью веб-проекта), я получаю параметр Input Type как null.

Я пробовал настраивать для него определенные маршруты.

Я проверил с Castle.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; добавление контроллеров:

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>(); 
    }); 
    } 
    } 
} 

-> Контроллер завод для SM версии не действительно делает много, так как я регистрируя контроллеры с СМ в предыдущем шаге

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

Вы пытаетесь отсканировать все сборки в реестре StructureMap и на вашем контроллере? Вот как это выглядит, но на самом деле это не имеет смысла. Ваш реестр StructureMap должен выполнить все сканирование, чтобы зарегистрировать все типы контроллеров в контейнере. Затем фабрика контроллера просто запрашивает контейнер для экземпляра запрашиваемого типа контроллера. –

ответ

0

Вы можете разместить свой контроллер завод ?

Я не понимаю, почему Castle будет работать, так как я думаю, что вы также получили бы null переданный для параметра Type из GetControllerInstance независимо от рамки DI, которую вы используете внутри этого метода. MVC отвечает за сопоставление строкового имени контроллера в URL-адресе с реальным типом (если вы не перевернули эти методы тоже). Поэтому я предполагаю, что это не среда DI, но MVC не может найти ваши классы контроллеров по какой-то причине.