2015-07-13 30 views
6

Desidero creare l'azione dei controller dal database (ASP.NET MVC 6 vNext). Ho un controller da tavolo e anche le azioni hanno le proprietà { ViewPath, ActionName } Dove actionName è {Controller}/{ActionName} Desidero creare pagine come questa. Come posso farcela? Ho classe per MVC 4, ma ho bisogno di riscriverlo per MVC 6Fabbrica controller ASP.NET MVC 6

public class ITSDefaultController : DefaultControllerFactory 
    { 

     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
     { 
      try 
      { 
       return base.CreateController(requestContext, controllerName) as Controller; 

      } 
      catch (Exception) 
      { 
       Controller controller = new ITSControllerBase(); 
       using (var db = new ITS.Database.DatabaseDataContext()) 
       { 
        string action = requestContext.RouteData.Values["action"] as string; 
        DynamicAction dynamicAction = null; 
        if (!db.Controllers.Any(x => x.ControllerName == controllerName && x.Views.Any(v => v.ViewName == action))) 
        { 
         dynamicAction = Actions["NotFound"].First(); 
         requestContext.RouteData.Values["controller"] = "NotFound"; 
         requestContext.RouteData.Values["action"] = "Index"; 
        } 
        else 
        { 
         dynamicAction = new DynamicAction() 
         { 
          ActionName = db.Views.First(d => d.ViewName == action && d.Controller.ControllerName == controllerName).ViewName, 
          Result =() => new ViewResult() 
         }; 
        } 


        if (dynamicAction != null) 
        { 
         controller.ActionInvoker = new DynamicActionInvoker() { DynamicAction = dynamicAction }; 
        } 

        return controller; 
       } 

      } 
     } 
     public override void ReleaseController(IController controller) 
     { 
      base.ReleaseController(controller); 
     } 
     public static ConcurrentDictionary> Actions = new ConcurrentDictionary>(); 
    } 
+0

C'è qualche progresso in questo argomento? Sarei felice di una soluzione. – xforfun

risposta

0

in realtà ho la stessa necessità di sostituire i componenti della pipeline MVC da alcuni quelli personalizzati, e ho trovato che l'IControllerFactory e IControllerActivator e la loro impostazione predefinita implementazioni sempre la stessa, allora l'esperienza è stata di sostituire l'MVC 6 DefaultControllerFactory dal CustomControllerFactory, ho fatto alcuni test sulla classe di avvio su ConfigureServices:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     var serviceDescriptor = services.FirstOrDefault(s => s.ServiceType.FullName.Contains("IControllerFactory")); 
     var serviceIndex = services.IndexOf(serviceDescriptor); 
     services.Insert(serviceIndex, new ServiceDescriptor(typeof(IControllerFactory), typeof(CustomControllerFactory), ServiceLifeTime.Singleton)); 
     services.RemoveAt(serviceIndex + 1); 
    } 

ed è fatto, inoltre è possibile aggiungere un'estensione metodo all'interfaccia IServiceCollection:

public static class ServiceCollectionExtensions 
    { 
     public static void(this IServiceCollection services, Type serviceType, Type implementationType, ServiceLifetime serviceLifetime = ServiceLifetime.Singleton) 
     { 
      var serviceDescriptor = services.FirstOrDefault(s => s.ServiceType == serviceType); 
      var serviceIndex = services.IndexOf(serviceDescriptor); 
      services.Insert(serviceIndex, new ServiceDescriptor(serviceType, implementationType, serviceLifetime)); 
      services.RemoveAt(serviceIndex + 1); 
     } 
    } 

dopo questa modifica è possibile utilizzarlo semplice come questo:

...... 
    services.AddMvc(); 
    services.ReplaceService(typeof(IControllerActivator), typeof(CustomControllerActivator)); 
    services.ReplaceService(typeof(IControllerFactory), typeof(CustomControllerFactory)); 
    ...... 

allora si può sostituire qualsiasi componente sul Mvc 6 Pipeline;

-1
 public class HomeController : Controller 
     { 
      public string _MyName { get; set; } 
      // GET: Home 
      public ActionResult Index() 
      { 
       return Content(_MyName); 
      } 

      public HomeController(string Name) 
      { 
       _MyName = Name; 
      } 
     } 


public class MyCustomController : IControllerFactory 
    { 
     public IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      HomeController objHomeController = new HomeController("Any thing Which you want to pass/inject."); 
      return objHomeController; 
     } 

     public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) 
     { 
      return SessionStateBehavior.Default; 
     } 

     public void ReleaseController(IController controller) 
     { 
      IDisposable disposable = controller as IDisposable; 
      if(disposable!=null) 
      { 
       disposable.Dispose(); 
      } 
     } 
    } 



protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      ControllerBuilder.Current.SetControllerFactory(new MyCustomController()); 
     } 
+0

Spiega la tua risposta! –

Problemi correlati