插件控制器,StructureMap和ASP.NET MVC

时间:2009-10-01 15:25:00

标签: asp.net-mvc structuremap

我正在使用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>();
    });
}

我的问题是我覆盖DefaultControllerFactory的GetControllerInstance方法。每次我发送除了有效控制器以外的其他东西(在它是Web项目的一部分的意义上有效),我将输入的Type参数设置为null。

我已尝试为其设置特定路线。

我已经使用Castle.Windsor进行了测试,这不是问题。

有人能指出我正确的方向吗?我很感激。

[编辑]

以下是代码:

- &GT;温莎控制器工厂

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

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

- &GT; 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 :(得分:0)

你可以发布你的控制器工厂吗?

我不明白为什么Castle会起作用,因为我认为你也会为GetControllerInstance的Type参数传入null,而不管你在该方法中使用的DI框架。 MVC负责将URL中控制器的字符串名称与实际类型进行匹配(除非您也过度使用这些方法)。所以我猜它不是DI框架,但MVC由于某种原因无法找到你的控制器类。