2016-12-23 14 views
1

MVC5で書いているカスタムCMSで大規模なオーバーホールを行っています。このカスタムCMSには、データベースに格納された「URL」を持つ「ページ」があります。たとえば、ユーザーがブラウザで/ stackoverflowをリクエストし、/ stackoverflowがURLとしてリストされているページがデータベースにある場合、特定のCoreCms/Index Controllerでデータベースコンテンツを提供し、データベースコンテンツをモデルとして表示しますプロパティ。アイデアは、この単一のコントローラ/ビューを使用して、データベースの任意のページを提供できるということです。MVC5のroutes.MapRouteでサービスコールを待つ方法

私が作業しているリライトでは、依存関係注入と非同期呼び出しはサービスレイヤでのみ使用されます。私は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を使う方法がわからないので、このRegisterRoutes関数でサービスとリポジトリの独自のインスタンスとDbContextを渡す必要はありません。

これについての助力は素晴らしいことです。私はこれを "正しい"行いたいと思います。

答えて

1

ちょうどあなたのためにそれを作成するために、リゾルバ(AutoFac)を尋ねる:

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

助けてくれてありがとう。私がやったことは、CoreCmsRouting> MatchメソッドにDependencyResolverを置いて、必要な場所に近いところにサービスを配置することでした。 – Solo812

関連する問題