Плагин контроллеров, StructureMap и ASP.NET MVC - PullRequest
1 голос
/ 01 октября 2009

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

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

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

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

Я провел тест с 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 На самом деле ничего особенного не происходит, так как я регистрирую контроллеры в 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();
    }
  }
}

1 Ответ

0 голосов
/ 01 октября 2009

Можете ли вы разместить свой контроллер фабрики?

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

...