ASP.NET MVC 3 การพึ่งพาการฉีด - ตัวควบคุม มุมมอง และตัวกรองการดำเนินการ

ฉันกำลังพยายามให้การฉีดพึ่งพาทำงานในแอปพลิเคชัน 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);
}

ด้วยบรรทัดที่มีการใส่ความคิดเห็น ฉันสูญเสียการฉีดการพึ่งพาอย่างสมบูรณ์ภายในมุมมองของฉัน ดังนั้นฉันจึงเปลี่ยนเป็นบรรทัดด้านบนซึ่งทำงานได้ดีอีกครั้งสำหรับมุมมองมาตรฐาน แต่ไม่ใช่สำหรับมุมมองเค้าโครง ฉันจะขอบคุณมากหากคุณแสดงให้ฉันเห็นว่าด้านบนสามารถปรับเปลี่ยนให้ทำงานกับมุมมองเค้าโครงได้อย่างไร

ในที่สุดฉันก็พยายามให้การฉีดฟิลเตอร์แอคชั่นทำงานได้เช่นกัน ฉันพบสองกรณีที่แตกต่างกัน:

  1. ใช้ตัวกรองกับการดำเนินการผ่านแอตทริบิวต์

  2. กำหนดให้เป็นตัวกรองส่วนกลาง เช่น:

    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>());

ตอนนี้ใช้งานได้อีกครั้ง แต่นี่เป็นวิธีที่ถูกต้องหรือไม่

ฉันขอขอบคุณความช่วยเหลือ ขอบคุณ


person nfplee    schedule 30.05.2012    source แหล่งที่มา
comment
ปรากฏว่า. Net 4 ไม่ได้จัดเตรียม ASP.NET MVC hooks เพื่อแทรกการพึ่งพาลงในหน้าเค้าโครง วิธีแก้ปัญหาสำหรับแอตทริบิวต์ตัวกรองดูเหมือนจะทำงานได้ดี แต่คุณอาจต้องการฉีดการขึ้นต่อกันทั่วโลกให้ดีขึ้นโดยการแทนที่วิธี GetFilters ของคลาส FilterAttributeFilterProvider และฉีดการขึ้นต่อกันที่คล้ายกับวิธีการทำในอีก 2 วิธี   -  person nfplee    schedule 19.06.2012
comment
อย่าใช้ตัวแก้ไขการพึ่งพาเพราะมันใช้งานไม่ได้ ติดกับการฉีดคอนสตรัคเตอร์   -  person CrazyCoderz    schedule 06.08.2012
comment
เพื่อตอบคำถามของคุณนี่เป็นวิธีที่ถูกต้องหรือไม่ ฉันจะไม่ทำอย่างนั้น   -  person CrazyCoderz    schedule 06.08.2012
comment
การแทรกตัวสร้างไม่ใช่ตัวเลือกที่มีมุมมอง   -  person Casey    schedule 25.04.2014