Ignia.Topics.Web.Mvc แอสเซมบลี Ignia.Topics.Web.Mvc จัดเตรียมการใช้งาน OnTopic เพื่อใช้กับ ASP.NET MVC 5.x Framework
มีองค์ประกอบสำคัญสามประการที่เป็นหัวใจสำคัญของการนำ MVC ไปใช้
MvcTopicRoutingService : นี่คือการดำเนินการอย่างเป็นรูปธรรมของ ITopicRoutingService ซึ่งยอมรับข้อมูลเชิงบริบทเกี่ยวกับคำขอที่กำหนด (ในกรณีนี้คือ URL และข้อมูลการกำหนดเส้นทาง) จากนั้นใช้เพื่อดึง Topic ปัจจุบันจาก ITopicRepositoryTopicController : นี่เป็นอินสแตนซ์คอนโทรลเลอร์เริ่มต้นที่สามารถใช้สำหรับเส้นทางหัวข้อ ใดก็ได้ มันจะตรวจสอบโดยอัตโนมัติว่ามี Topic อยู่หรือไม่ปิดใช้งาน ( IsDisabled ) และจะยอมรับการเปลี่ยนเส้นทางใด ๆ (เช่น หากกรอกแอตทริบิวต์ Url แล้ว) มิฉะนั้น จะส่งกลับ TopicViewResult ตามโมเดลมุมมอง ชื่อมุมมอง และประเภทเนื้อหาTopicViewEngine : TopicViewEngine จะถูกเรียกทุกครั้งที่มีการร้องขอมุมมอง ทำงานร่วมกับ TopicViewResult เพื่อระบุมุมมอง MVC ที่ตรงกันตามสถานที่และแบบแผนที่กำหนดไว้ล่วงหน้า สิ่งเหล่านี้จะกล่าวถึงด้านล่าง มีตัวควบคุมหลักหกตัวที่มาพร้อมกับการใช้งาน MVC นอกเหนือจาก TopicController หลักแล้ว สิ่งเหล่านี้ยังรวมถึงตัวควบคุมเสริมต่อไปนี้:
ErrorControllerBase<T> : ให้การสนับสนุนสำหรับการดำเนินการ Error , NotFound และ InternalServer สามารถยอมรับ IPageTopicViewModel ใดๆ เป็นอาร์กิวเมนต์ทั่วไปได้ ที่จะใช้เป็นโมเดลมุมมองFallbackController : ใช้ในโรงงานคอนโทรลเลอร์เป็นทางเลือก ในกรณีที่ไม่มีคอนโทรลเลอร์อื่นใดที่สามารถยอมรับคำขอได้ เพียงส่งคืน NotFoundResult พร้อมข้อความที่กำหนดไว้ล่วงหน้าLayoutControllerBase<T> : ให้การสนับสนุนสำหรับเมนูการนำทางโดยการแมปสามอันดับแรกของเนมสเปซปัจจุบันโดยอัตโนมัติ (เช่น Web ลูก ๆ และหลาน) สามารถยอมรับ INavigationTopicViewModel ใด ๆ เป็นอาร์กิวเมนต์ทั่วไปได้ ที่จะใช้เป็นโมเดลมุมมองสำหรับอินสแตนซ์ที่แมปแต่ละรายการRedirectController : ให้การดำเนิน Redirect เดียวซึ่งสามารถเชื่อมโยงกับเส้นทางเช่น /Topic/{ID}/ ; ซึ่งจะให้การสนับสนุน URL ถาวรที่ไม่ขึ้นอยู่กับ GetWebPath()SitemapController : จัดให้มีการดำเนินการ Sitemap เดียวซึ่งส่งคืนการอ้างอิงไปยัง ITopicRepository ดังนั้นจึงอนุญาตให้มุมมองแผนผังเว็บไซต์เรียกซ้ำในกราฟหัวข้อทั้งหมด รวมถึงแอตทริบิวต์ทั้งหมดหมายเหตุ: MVC ไม่มีวิธีปฏิบัติจริงในการกำหนดเส้นทางสำหรับคอนโทรลเลอร์ทั่วไป ด้วยเหตุนี้ สิ่งเหล่านี้ จึงต้อง ถูกจัดประเภทย่อยตามการใช้งานแต่ละครั้ง ตัวควบคุมที่ได้รับไม่จำเป็นต้องทำอะไรนอกเหนือจากการให้การอ้างอิงประเภทเฉพาะไปยังฐานทั่วไป
ตามค่าเริ่มต้น OnTopic จะจับคู่มุมมองตาม ContentType ของหัวข้อปัจจุบัน และ View ถ้ามี
มีหลายวิธีในการตั้งค่ามุมมอง TopicViewResult จะประเมินการดูโดยอัตโนมัติตามตำแหน่งต่อไปนี้ เลือกอันแรกที่ตรงกับชื่อมุมมองที่ถูกต้อง
?View= พารามิเตอร์สตริงการสืบค้น (เช่น ?View=Accordion )Accept ส่วนหัว (เช่น Accept=application/json ); จะถือว่าส่วนหลัง / เป็นชื่อมุมมองที่เป็นไปได้View แอตทริบิวต์ (เช่น topic.View )ContentType (เช่น topic.ContentType ) สำหรับแต่ละกฎการจับคู่มุมมองด้านบน TopicViewEngine จะค้นหาตำแหน่งต่อไปนี้เพื่อดูมุมมองที่ตรงกัน:
~/Views/{ContentType}/{View}.cshtml~/Views/ContentTypes/{ContentType}.{View}.cshtml~/Views/ContentTypes/{ContentType}.cshtml~/Views/Shared/{View}.cshtmlหมายเหตุ: หลังจากค้นหาแต่ละตำแหน่งเหล่านี้สำหรับแต่ละกฎการจับคู่มุมมองแล้ว การควบคุมจะถูกส่งไปยัง
RazorViewEngineซึ่งจะค้นหาตำแหน่งเริ่มต้นที่พร้อมใช้งานทันทีสำหรับ ASP.NET MVC
หาก topic.ContentType คือ ContentList และส่วนหัว Accept คือ application/json ดังนั้น TopicViewResult และ TopicViewEngine จะประสานงานเพื่อค้นหาเส้นทางต่อไปนี้:
~/Views/ContentList/JSON.cshtml~/Views/ContentTypes/ContentList.JSON.cshtml~/Views/ContentTypes/JSON.cshtml~/Views/Shared/JSON.cshtml หากไม่พบรายการที่ตรงกัน ส่วนหัว Accept ถัดไปจะถูกค้นหา ในที่สุด หากไม่พบรายการที่ตรงกันในกฎการจับคู่มุมมองต่างๆ ระบบจะค้นหาสิ่งต่อไปนี้:
~/Views/ContentList/ContentList.cshtml~/Views/ContentTypes/ContentList.ContentList.cshtml~/Views/ContentTypes/ContentList.cshtml~/Views/Shared/ContentList.cshtml ใน global.asax.cs ส่วนประกอบต่อไปนี้ควรได้รับการลงทะเบียนภายใต้ตัวจัดการเหตุการณ์ Application_Start :
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
หมายเหตุ: ชื่อโรงงานตัวควบคุมนั้นกำหนดเองได้ และควรเป็นไปตามแบบแผนที่เหมาะสมสำหรับไซต์งาน โดยทั่วไปแล้ว Ignia จะใช้
{OrganizationName}ControllerFactory(เช่นIgniaControllerFactory) แต่ OnTopic ไม่จำเป็นต้องรู้หรือสนใจว่าชื่อนั้นคืออะไร ที่อยู่ระหว่างแอปพลิเคชันของคุณกับ ASP.NET MVC Framework
เมื่อลงทะเบียนเส้นทางผ่าน RouteConfig.RegisterRoutes() (โดยทั่วไปจะผ่านคลาส RouteConfig ) ให้ลงทะเบียนเส้นทางสำหรับเส้นทาง OnTopic ใดๆ:
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
หมายเหตุ: เนื่องจาก OnTopic อาศัยชื่อพาธไวด์การ์ด จึงควรกำหนดค่าเส้นทางใหม่สำหรับเนมสเปซรูททุกอัน (เช่น
/Web) แม้ว่าจะสามารถกำหนดค่า OnTopic เพื่อประเมินเส้นทาง ทั้งหมด ได้ แต่ก็ทำให้ยากต่อการมอบหมายการควบคุมให้กับตัวควบคุมและตัวจัดการอื่นๆ เมื่อจำเป็น
เนื่องจาก OnTopic อาศัย Constructor Inject จึงต้องกำหนดค่าแอปพลิเคชันใน Composition Root ในกรณีของ ASP.NET MVC นั่นหมายถึงโรงงานตัวควบคุมแบบกำหนดเอง โครงสร้างพื้นฐานของสิ่งนี้อาจมีลักษณะดังนี้:
var connectionString = ConfigurationManager.ConnectionStrings["OnTopic"].ConnectionString;
var sqlTopicRepository = new SqlTopicRepository(connectionString);
var cachedTopicRepository = new CachedTopicRepository(sqlTopicRepository);
var topicViewModelLookupService = new TopicViewModelLookupService();
var topicMappingService = new TopicMappingService(cachedTopicRepository, topicViewModelLookupService);
var mvcTopicRoutingService = new MvcTopicRoutingService(
cachedTopicRepository,
requestContext.HttpContext.Request.Url,
requestContext.RouteData
);
switch (controllerType.Name) {
case nameof(TopicController):
return new TopicController(sqlTopicRepository, mvcTopicRoutingService, topicMappingService);
case default:
return base.GetControllerInstance(requestContext, controllerType);
}
สำหรับเทมเพลตอ้างอิงที่สมบูรณ์ รวมถึงตัวควบคุมเสริม โปรดดูที่ OrganizationNameControllerFactory.cs Gist
หมายเหตุ:
TopicControllerเริ่มต้นจะระบุหัวข้อปัจจุบันโดยอัตโนมัติ (ตามเช่น URL) แมปหัวข้อปัจจุบันกับโมเดลมุมมองที่สอดคล้องกัน (ตามแบบแผนTopicMappingService) จากนั้นส่งคืนมุมมองที่สอดคล้องกัน (ตามแบบแผนมุมมอง) สำหรับการใช้งานส่วนใหญ่ก็เพียงพอแล้ว อย่างไรก็ตาม หากจำเป็นต้องใช้กฎการแม็พแบบกำหนดเองหรือตรรกะการนำเสนอเพิ่มเติม ผู้นำไปใช้สามารถคลาสย่อยTopicControllerได้