Моя цель - изменить Регистрация контроллера asp.net mvc, чтобы я мог создавать контроллеры и представления в отдельной (дочерней) сборке и просто копировать файлы представления и библиотеки DLL в главное приложение MVC, и новые контроллеры эффективно «подключаются» к главному приложению. .
Очевидно, мне понадобится какой-то шаблон IoC, но я в недоумении.
Я хотел создать дочернюю сборку с system.web.mvc, а затем просто начать создание классов контроллеров, унаследованных от Контроллер
:
Отдельная сборка:
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);
}
}
Теперь я в растерянности. Я не знаю, что это значит. Первоначально я собирался написать класс «Загрузчик контроллера», такой как локатор служб, например:
Хост-приложение MVC:
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);
? Или мне вообще следует использовать другой подход?
Ссылка на другую сборку из корневого проекта ASP.NET MVC. Если контроллеры находятся в другом пространстве имен, вам нужно изменить маршруты в global.asax, например:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { typeof(HomeController).Namespace }
);
}
Обратите внимание на дополнительный аргумент namespaces
для метода MapRoute
.