ฉันกำลังพยายามให้การฉีดพึ่งพาทำงานในแอปพลิเคชัน ASP.NET MVC 3 โดยใช้ Microsoft Unity ก่อนอื่นฉันได้ติดตั้ง IDependencyResolver ของตัวเองและเปิดใช้งานในไฟล์ Global.asax ของฉันดังนี้:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
ฉันพบว่าฉันไม่จำเป็นต้องทำอะไรอย่างอื่นเพื่อให้คอนโทรลเลอร์ฉีด (ผ่านทั้งตัวสร้างและแอตทริบิวต์ [การพึ่งพา]) ทำงาน ด้วยกลไกการดูเริ่มต้น ฉันยังพบว่าฉันสามารถให้แอตทริบิวต์ [การพึ่งพา] ทำงานในมุมมองมาตรฐาน แต่ไม่ใช่มุมมองเค้าโครง เป็นไปได้ไหมที่จะทำให้สิ่งนี้ใช้ได้กับมุมมองเค้าโครงด้วย
อย่างไรก็ตาม ฉันได้ใช้เอ็นจิ้นการดูของตัวเองซึ่งสืบทอดมาจาก VirtualPathProviderViewEngine ที่แทนที่เมธอด CreateView/CreatePartialView และส่งคืนมุมมองที่กำหนดเองของฉันเอง (ใช้ IView) ดูวิธีการเรนเดอร์ของมุมมองแบบกำหนดเองด้านล่าง:
public void Render(ViewContext viewContext, TextWriter writer) {
var webViewPage = DependencyResolver.Current.GetService(_type) as WebViewPage;
//var webViewPage = Activator.CreateInstance(_type) as WebViewPage;
if (webViewPage == null)
throw new InvalidOperationException("Invalid view type");
webViewPage.VirtualPath = _virtualPath;
webViewPage.ViewContext = viewContext;
webViewPage.ViewData = viewContext.ViewData;
webViewPage.InitHelpers();
WebPageRenderingBase startPage = null;
if (_runViewStartPages)
startPage = StartPage.GetStartPage(webViewPage, "_ViewStart", _viewStartFileExtensions);
var pageContext = new WebPageContext(viewContext.HttpContext, webViewPage, null);
webViewPage.ExecutePageHierarchy(pageContext, writer, startPage);
}
ด้วยบรรทัดที่มีการใส่ความคิดเห็น ฉันสูญเสียการฉีดการพึ่งพาอย่างสมบูรณ์ภายในมุมมองของฉัน ดังนั้นฉันจึงเปลี่ยนเป็นบรรทัดด้านบนซึ่งทำงานได้ดีอีกครั้งสำหรับมุมมองมาตรฐาน แต่ไม่ใช่สำหรับมุมมองเค้าโครง ฉันจะขอบคุณมากหากคุณแสดงให้ฉันเห็นว่าด้านบนสามารถปรับเปลี่ยนให้ทำงานกับมุมมองเค้าโครงได้อย่างไร
ในที่สุดฉันก็พยายามให้การฉีดฟิลเตอร์แอคชั่นทำงานได้เช่นกัน ฉันพบสองกรณีที่แตกต่างกัน:
ใช้ตัวกรองกับการดำเนินการผ่านแอตทริบิวต์
กำหนดให้เป็นตัวกรองส่วนกลาง เช่น:
GlobalFilters.Filters.Add (TestAttribute ใหม่ ());
ดูเหมือนจะไม่ใช้ตัวแก้ไขการพึ่งพา ดังนั้นฉันต้องทำงานพิเศษบางอย่าง โปรดแก้ไขฉันหากมีวิธีที่ดีกว่า เพื่อเปิดใช้งานสถานการณ์แรกฉันได้ทำสิ่งต่อไปนี้:
public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider {
private IUnityContainer _container;
protected override IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor);
foreach (var attribute in attributes) {
_container.BuildUp(attribute.GetType(), attribute);
}
return attributes;
}
protected override IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
var attributes = base.GetActionAttributes(controllerContext, actionDescriptor);
foreach (var attribute in attributes) {
_container.BuildUp(attribute.GetType(), attribute);
}
return attributes;
}
}
จากนั้นกำหนดสิ่งนี้ภายในไฟล์ Global.asax ของฉันดังนี้:
FilterProviders.Providers.Remove(FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider));
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
มันใช้งานได้ดี แต่ฉันสงสัยว่านี่เป็นวิธีที่ถูกต้องหรือไม่? เพื่อแก้ไขกรณีที่สอง ฉันเพียงเปลี่ยนตำแหน่งที่ฉันกำหนดตัวกรองส่วนกลางเป็นดังนี้:
GlobalFilters.Filters.Add(DependencyResolver.Current.GetService<TestAttribute>());
ตอนนี้ใช้งานได้อีกครั้ง แต่นี่เป็นวิธีที่ถูกต้องหรือไม่
ฉันขอขอบคุณความช่วยเหลือ ขอบคุณ