Я использую 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();
}
}
}
Вы пытаетесь отсканировать все сборки в реестре StructureMap и на вашем контроллере? Вот как это выглядит, но на самом деле это не имеет смысла. Ваш реестр StructureMap должен выполнить все сканирование, чтобы зарегистрировать все типы контроллеров в контейнере. Затем фабрика контроллера просто запрашивает контейнер для экземпляра запрашиваемого типа контроллера. –