Я делаю массовый капитальный ремонт на пользовательской 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.
Любая помощь по этому вопросу будет замечательной. Я хотел бы сделать это «правильно».
Спасибо за помощь. То, что я закончил, - это установить DependencyResolver в методе CoreCmsRouting> Match, чтобы найти службу ближе к тому, где мне это нужно. – Solo812