我正在使用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();
}
}
}
答案 0 :(得分:0)
你可以发布你的控制器工厂吗?
我不明白为什么Castle会起作用,因为我认为你也会为GetControllerInstance的Type参数传入null,而不管你在该方法中使用的DI框架。 MVC负责将URL中控制器的字符串名称与实际类型进行匹配(除非您也过度使用这些方法)。所以我猜它不是DI框架,但MVC由于某种原因无法找到你的控制器类。