Моя цель состоит в том, чтобы изменить реестр контроллеров 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();
}
}
}
Ууу все отлично и денди.Но затем я посмотрел на изменение реестра контроллера хост-приложения для загрузки моего нового дочернего контроллера во время выполнения, и я запутался.Возможно, потому что мне нужно более глубокое понимание C #.
В любом случае, я подумал, что мне нужно создать класс 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;
}
}
А затем я планировал использовать свой список контроллеров.зарегистрировать их в фабрике контроллеров.Но как?Я чувствую, что я на грани выяснения этого.Я предполагаю, что все сводится к этому вопросу: как мне подключиться к return base.GetControllerInstance(requestContext, controllerType);
?Или мне вообще следует использовать другой подход?