如何在 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>() }
);
我正在对用 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>() }
);