Моя цель - изменить регистр контроллера asp.net mvc, чтобы я мог создавать контроллеры и представления в отдельной (дочерней) сборке и просто копировать файлы View и DLL в приложение MVC хоста и эффективно использовать новые контроллеры "Подключено" к хост-приложению.
Очевидно, мне понадобится какой-то шаблон IoC, но я в недоумении.
Моя мысль заключалась в том, чтобы иметь дочернюю сборку с ссылкой на system.web.mvc, а затем просто начать создавать классы контроллера, унаследованные от Controller
:
Отдельная сборка:
using System.Web;
using System.Web.Mvc;
namespace ChildApp
{
public class ChildController : Controller
{
ActionResult Index()
{
return View();
}
}
}
Все прекрасное и денди. Но затем я изучил модификацию реестра контроллера приложения хоста для загрузки моего нового дочернего контроллера во время выполнения, и я запутался. Возможно, потому, что мне нужно более глубокое понимание С#.
Во всяком случае, мне показалось, что мне нужно создать класс CustomControllerFactory
. Поэтому я начал писать класс, который заменил бы метод GetControllerInstance()
. Когда я печатал, intellisence выскочил это:
Host MVC Application:
public class CustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
Теперь, в этот момент я не понимаю. Я не знаю, что это делает. Первоначально я собирался написать класс "Контроллер-загрузчик", например, "Локатор сервисов":
Host MVC Application:
public class ControllerLoader
{
public static IList<IController> Load(string folder)
{
IList<IController> controllers = new List<IController>();
// Get files in folder
string[] files = Directory.GetFiles(folder, "*.plug.dll");
foreach(string file in files)
{
Assembly assembly = Assembly.LoadFile(file);
var types = assembly.GetExportedTypes();
foreach (Type type in types)
{
if (type.GetInterfaces().Contains(typeof(IController)))
{
object instance = Activator.CreateInstance(type);
controllers.Add(instance as IController);
}
}
}
return controllers;
}
}
И затем я планировал использовать список контроллеров для регистрации их в контроллере factory. Но как? Я чувствую, что нахожусь на грани выяснения этого. Я думаю, все это сводится к этому вопросу: как мне подключиться к return base.GetControllerInstance(requestContext, controllerType);
? Или, должен ли я использовать другой подход вообще?