vista una tutorial pasar net mvc multiples modelos modelo español datos crear controlador asp c# asp.net asp.net-mvc plugins inversion-of-control

c# - una - ¿Cómo registrar un controlador en ASP.NET MVC cuando la clase del controlador está en un ensamblaje diferente?



tutorial asp net mvc (4)

Crear un módulo separado como se muestra Plugin Estructura del proyecto

Tenga en cuenta que algunos archivos fueron excluidos del proyecto.

El archivo MessagingController.cs es el siguiente:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MessagingModule.Controllers { public class MessagingController : Controller { // // GET: /Messaging/ public ActionResult Index() { var appName = Session["appName"]; // Get some value from another module return Content("Yep Messaging module @"+ appName); } } }

El archivo MessagingAreaRegistration es como se muestra:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Mvc; namespace MessagingModule { public class MessagingAreaRegistration : AreaRegistration { public override string AreaName { get { return "Messaging"; } } public override void RegisterArea( AreaRegistrationContext context ) { context.MapRoute( "Messaging_default", "Messaging/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } //new[] { "MessagingModule.Controllers" } ); } } }

La poción relevante del archivo Global.asax.cs es la siguiente:

[Cargue el complemento externo (controladores, biblioteca de controladores api) en el dominio de la aplicación actual. Después de que asp.net mvc haga el resto por usted (registro de área y descubrimiento de controladores) [3]

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using System.Reflection; using System.Web.Configuration; using System.Text.RegularExpressions; namespace mvcapp { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { var domain = AppDomain.CurrentDomain; domain.Load("MessagingModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

Mi objetivo es modificar el registro de controlador de asp.net mvc para que pueda crear controladores y vistas en un ensamblaje (secundario) separado, y simplemente copiar los archivos de View y los DLL a la aplicación host MVC y los nuevos controladores estén efectivamente "enchufados". "a la aplicación de host.

Obviamente, necesitaré algún tipo de patrón de IoC, pero estoy perdido.

Mi idea era tener un ensamblado secundario con system.web.mvc referenciado y luego comenzar a construir las clases de controlador heredadas de Controller :

Asamblea separada:

using System.Web; using System.Web.Mvc; namespace ChildApp { public class ChildController : Controller { ActionResult Index() { return View(); } } }

Yay todo bien y elegante. Pero luego busqué modificar el registro del controlador de la aplicación host para cargar mi nuevo controlador secundario en tiempo de ejecución, y me confundí. Tal vez porque necesito una comprensión más profunda de C #.

De todos modos, pensé que necesitaba crear una clase CustomControllerFactory . Así que comencé a escribir una clase que anularía el método GetControllerInstance() . Mientras escribía, la intelliscencia apareció esto:

Aplicación Host MVC:

public class CustomControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) { return base.GetControllerInstance(requestContext, controllerType); } }

Ahora, en este punto, estoy perdido. No sé lo que eso hace. Originalmente, iba a escribir una clase "Cargador del controlador" como un localizador de servicios como este:

Aplicación Host 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; } }

Y luego estaba planeando usar mi lista de controladores para registrarlos en la fábrica de controladores. ¿Pero cómo? Siento que estoy a punto de resolverlo. Supongo que todo se reduce a esta pregunta: ¿cómo me return base.GetControllerInstance(requestContext, controllerType); en la base de return base.GetControllerInstance(requestContext, controllerType); ? O, ¿debería usar un enfoque diferente por completo?


Haga referencia al otro ensamblaje desde el proyecto ''raíz'' ASP.NET MVC. Si los controladores están en otro espacio de nombres, deberá modificar las rutas en global.asax, así:

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 } ); }

Observe el argumento adicional de namespaces para el método MapRoute .


Su otro proyecto debe configurarse como un área y obtendrá el resultado deseado. La clase de registro de área traerá su proyecto de área a la mezcla. Luego puede simplemente colocar el dll en una aplicación en ejecución y se ejecutará sin construir toda la aplicación y volver a implementarla.

La forma más fácil de hacerlo es agregar un nuevo proyecto mvc a su solución y hacer que Visual Studio cree el nuevo proyecto dentro de / areas / mynewprog /. Elimine todos los archivos que no necesita y agregue una clase de registro de área para conectarlo.

Construya el proyecto, tome dll y colóquelo en el directorio bin de sitios web en ejecución y ese es ..

A continuación, solo tiene que tratar con las vistas y esas cosas, compilarlas en el dll o copiarlas al servidor en la carpeta areas / mynewproj /.


mi experiencia con los controladores es que esto solo funciona. Copie el conjunto en el directorio bin (o agregue una referencia al ensamblaje y se copiará allí para usted)

No he intentado con vistas