如何在 MVC5 中等待 routes.MapRoute 中的服务调用

How to await a service call in routes.MapRoute in MVC5

我正在对用 MVC5 编写的自定义 CMS 进行大规模检修。此自定义 CMS 有 "pages" 个 "urls" 存储在数据库中。例如,如果用户在浏览器中请求 /Whosebug 并且数据库中有一个页面将 /Whosebug 列为 url,那么我将在特定的 CoreCms/Index 控制器上提供数据库内容并查看数据库内容作为模型 属性。我的想法是,我可以使用这个 controller/view 来提供数据库中的任何页面。

我正在进行的重写仅在服务层使用依赖注入和异步调用。看来我在使用 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 }
        );
    }

请注意,我正在重写旧代码和约束:new { url = new CmsCoreRouting() } 是我打算在这里更改的代码,我相信。

作为参考,这里是 CmsCoreRouting class...

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 = new CmsCoreRouting() 中告诉它这样做)但我不确定如何同时使用 AutoFac 的 DI 以便我不必在此 RegisterRoutes 函数上传递我自己的服务和存储库实例以及 DbContext。

如果对此有任何帮助,那就太好了。我想这样做 "right".

只需请求解析器 (AutoFac) 为您创建即可:

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