2017-01-29 3 views
2

Я прочитал об осуществлении папки особенности здесь: https://msdn.microsoft.com/en-us/magazine/mt763233.aspxСпособ по имени действий в иерархии папок вложенной особенности

Мне очень нравится идея отделить от особенностей вместо типов файлов. Я работаю над расширенным решением, которое позволяет создавать иерархию функций на неограниченных уровнях.

Для этого я создал очень простую логическую организацию для организации папок/файлов. Например:

[Feature] 
    [Auth] 
    [Entity] 
     User.cs 
     Role.cs 
    [Route] 
     [Login] 
     [Forgot] 
      Forgot.cs 
      Forgot.cshtml 
      ForgotModel.cs 
     Login.cs 
     Login.cshtml 
     LoginModel.cs 
     Index.cs 
     Index.cshtml 
    Auth.cs 

Как вы можете видеть все, что находится под верхней областью функций. Внутри этой папки есть специальные папки с функциями (Auth). Под ним есть подпапка Route, которая содержит иерархию всех контроллеров/представлений.

Для примера выше я уже осваивал пользовательскую логику маршрутизации, которая обеспечивает мне эти маршруты:

/Auth 
/Auth/Login 
/Auth/Login/Forgot 

Это работает, но я не знаю, если я сделал это хорошо или укомплектовать неправильно. Для достижения пользовательской маршрутизации я просто сделал это:

public void Apply(ControllerModel controller) 
{ 
    //From the article I linked before: 
    controller.Properties.Add("feature", 
    GetFeatureName(controller.ControllerType)); 

    //My custom route value implementation: 
    controller.Selectors.Clear(); 

    var routePath = GetRoutePath(controller.ControllerType); //"auth/login/forgot" 
    var routeAttr = new RouteAttribute(routePath); 
    var selector = new SelectorModel 
    { 
     AttributeRouteModel = new AttributeRouteModel(routeAttr) 
    }; 

    controller.Selectors.Add(selector); 

} 
  • ли controller.Selectors хорошее место, чтобы применить пользовательский путь по маршруту?
  • Действительно ли это необходимо. Очистить() перед добавлением нового?

Я не нашёл ни одной статьи о контроллере.

Я также хотел бы реализовать поддержку имени действия для преобразования http-метода, где все стандартные имена HTTP-глаголов (get, post, put, patch, delete) автоматически привязываются к соответствующему фильтру http-метода. Например:

public class Login : Controller 
{ 
    public IAcionResult Get() 
    { 
     return View(); 
    } 

    public IAcionResult Post(LoginModel model) 
    { 
     return Ok() 
    } 
} 

Я не хочу использовать [HttpGet] и [HttpPost] атрибуты везде у меня есть только получить/разместить действия. Я думаю, что для этого есть официальное решение, но я не мог его найти.

ответ

0

Я нашел решение, которое выглядит как хорошо работает. Но я не совсем уверен, что я только что сделал с этим:

public class ActionModelConvention : IActionModelConvention 
    { 
     private static readonly List<String> httpVerbs; 

     static ActionModelConvention() 
     { 
      httpVerbs = new List<String> { "GET", "POST", "PUT", "PATCH", "DELETE" }; 
     } 

     private readonly ActionParserOptions options; 

     public ActionModelConvention(ActionParserOptions options) 
     { 
      this.options = options; 
     } 

     public void Apply(ActionModel action) 
     { 
      var upper = action.ActionName.ToUpper(); 
      var found = httpVerbs.FirstOrDefault(
        e => upper.Length >= e.Length && 
        e == upper.Substring(0, e.Length)); 

      if (found != null) 
      { 
       //action.Selectors.Clear(); //no need to clear...I think... 

       var constraint = new Microsoft.AspNetCore.Mvc.Internal //> Internal! 
        .HttpMethodActionConstraint(new String[] { found }); 

       var selector = new SelectorModel(); 
        selector.ActionConstraints.Add(constraint); 

       action.Selectors.Add(selector); 
      } 
     } 

Я не думаю, что это будет хорошая идея, чтобы использовать что-нибудь из Microsoft.AspNetCore.Mvc.Internal пространства имен. Но я еще не нашел другого пути.

Любые мысли?