Я использую 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();
}
}
}