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を渡す必要はありません。
これについての助力は素晴らしいことです。私はこれを "正しい"行いたいと思います。
助けてくれてありがとう。私がやったことは、CoreCmsRouting> MatchメソッドにDependencyResolverを置いて、必要な場所に近いところにサービスを配置することでした。 – Solo812