2016-12-23 6 views
1

Я делаю массовый капитальный ремонт на пользовательской CMS, которую я пишу в MVC5. Эта пользовательская CMS имеет «страницы», которые имеют «URL-адреса», хранящиеся в базе данных. Например, если пользователь запросил/stackoverflow в браузере, и в базе данных была страница с/stackoverflow, указанная в качестве URL-адреса, я обслуживаю содержимое базы данных на конкретном контроллере CoreCms/Index и просматриваю содержимое базы данных в качестве модели имущество. Идея состоит в том, что я могу использовать этот единственный контроллер/представление для обслуживания любой страницы в базе данных.Как дождаться вызова службы в route.MapRoute в MVC5

Переписывание, в котором я работаю, использует инъекции зависимостей и асинхронные вызовы только на уровне обслуживания. Похоже, что у меня возникают проблемы с статическим методом RouteConfig RegisterRoutes.

Вот код ...

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("FileBrowser/{pathInfo}"); 

     routes.MapRoute(
      name: "CmsRoutes", 
      url: "{*permalink}", 
      defaults: new { controller = "CmsCorePage", action = "Index" }, 
      constraints: new { url = new CmsCoreRouting() } 
     ); 

     routes.MapRoute(
      name: "ArticlesCategoryRoute", 
      url: "Articles/{categoryURL}", 
      defaults: new { controller = "CmsCoreArticles", action = "Index", categoryURL = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "ArticlesPostsRoute", 
      url: "Articles/{categoryURL}/{postURL}", 
      defaults: new { controller = "CmsCoreArticles", action = "ArticlePost", categoryURL = UrlParameter.Optional, postURL = UrlParameter.Optional } 
     ); 

     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

Обратите внимание, что я переписывать старый код и ограничения: новый {URL = новый CmsCoreRouting()} является код, который я намереваюсь на изменение здесь я считаю.

Для справки, вот класс CmsCoreRouting ...

public class CmsCoreRouting : IRouteConstraint 
{ 

    private ICoreCmsServices _coreSvc; 

    public CmsCoreRouting() 
    { 
    } 

    public CmsCoreRouting(ICoreCmsServices coreSvc) 
    { 
     _coreSvc = coreSvc; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (httpContext?.Request?.FilePath == null) { return false; } 

     string myURL = httpContext.Request.FilePath; 

     if (myURL.StartsWith("/")) 
     { 
      myURL = myURL.Substring(1, myURL.Length - 1); 
     } 

     myURL = myURL.ToLower(); 

     var siteId = CoreCms.Core.Settings.CoreCmsSettings.SiteId; 

     var cmsPage = AsyncUtility.RunSync(() => _coreSvc.PageService.FindBySiteAndUrlAsync(siteId, myURL)); 

     if (cmsPage != null) 
     { 
      return true; 
     } 

     var cmsArticle = AsyncUtility.RunSync(() => _coreSvc.ArticleService.FindCategoryBySiteAndUrlAsync(siteId, myURL)); 

     if (cmsArticle != null) 
     { 
      return true; 
     } 

     return false; 
    } 


} 

Проблема: При запуске MVC, он вызывает конструктор без параметров на CmsCoreRouting (потому что я сказал это в URL = новый CmsCoreRouting()), но Я не уверен, как использовать оба параметра AutoFac DI, чтобы мне не пришлось передавать мои собственные экземпляры службы и репозитория и DbContext в этой функции RegisterRoutes.

Любая помощь по этому вопросу будет замечательной. Я хотел бы сделать это «правильно».

ответ

1

Просто спросите распознаватель (AutoFac), чтобы создать для Вас:

routes.MapRoute(
     name: "CmsRoutes", 
     url: "{*permalink}", 
     defaults: new { controller = "CmsCorePage", action = "Index" }, 
     constraints: new { url = DependencyResolver.Current.GetService<CmsCoreRouting>() } 
    ); 
+0

Спасибо за помощь. То, что я закончил, - это установить DependencyResolver в методе CoreCmsRouting> Match, чтобы найти службу ближе к тому, где мне это нужно. – Solo812