2015-07-13 16 views
6

Ich möchte Controller erstellen Aktion aus der Datenbank (ASP.NET MVC 6 vNext). Ich habe Tischsteuerung und auch Aktionen Aktionstabelle hat Eigenschaften { ViewPath, ActionName } Wo action {Controller}/{ActionName} I-Seiten wie diese bauen will. Wie kann ich es schaffen? Ich habe Klasse für MVC 4, aber ich muss es MVC 6ASP.NET MVC 6 Controller Factory

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

Gibt es Fortschritte zu diesem Thema? Ich würde mich über eine Lösung freuen. – xforfun

Antwort

0

tatsächlich Ich habe das gleiche Notwendigkeit neu zu schreiben Mvc Pipeline-Komponenten durch einige benutzerdefinierte zu ersetzen, und ich fand, dass die IControllerFactory und IControllerActivator und ihre Standard Implementierungen immer noch die gleichen, dann ist die Erfahrung, um die Mvc 6 DefaultControllerFactory durch die CustomControllerFactory, ich habe einige Tests auf der Startklasse erfolgt auf ConfigureServices zu ersetzen war:

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

und es erledigt ist, können Sie auch eine Erweiterung hinzufügen Methode zur IServiceCollection-Schnittstelle:

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

nach dieser Änderung können Sie es so einfach wie diese verwenden:

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

dann können Sie jede Komponente auf der Mvc 6 Pipeline ersetzen;

-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

Erkläre deine Antwort! –

Verwandte Themen