首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC ValueProvider 體系第三篇:ValueProviderFactory 與註冊機制

     編輯:關於ASP.NET

ValueProviderFactory 抽象基類

public abstract class ValueProviderFactory
{
    public abstract IValueProvider GetValueProvider(ControllerContext controllerContext);
}

六大內建 Factory

Factory建立的 ValueProvider資料來源
ChildActionValueProviderFactoryChildActionValueProvider父 Action 的 ViewData/ViewBag
FormValueProviderFactoryFormValueProviderPOST 表單資料 (Request.Form)
JsonValueProviderFactoryDictionaryValueProvider<object>JSON 要求本文 (Request.InputStream)
RouteDataValueProviderFactoryRouteDataValueProvider路由資料 (RouteData.Values)
QueryStringValueProviderFactoryQueryStringValueProvider查詢字串 (Request.QueryString)
HttpFileCollectionValueProviderFactoryHttpFileCollectionValueProvider上傳檔案 (Request.Files)

ValueProviderFactories 靜態註冊中心

public static class ValueProviderFactories
{
    public static ValueProviderFactoryCollection Factories { get; }
}

public class ValueProviderFactoryCollection : Collection<ValueProviderFactory>
{
    public IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        var providers = new List<IValueProvider>();
        foreach (var factory in this)
            providers.Add(factory.GetValueProvider(controllerContext));
        return new ValueProviderCollection(providers);
    }
}

預設註冊順序與優先級

  1. ChildActionValueProviderFactory
  2. FormValueProviderFactory
  3. JsonValueProviderFactory
  4. RouteDataValueProviderFactory
  5. QueryStringValueProviderFactory
  6. HttpFileCollectionValueProviderFactory

優先級規則:集合中越前面的 Provider 產生的 ValueProvider 越優先被 ValueProviderCollection 查詢。同名鍵存在於表單與查詢字串時,表單值勝出。

自訂 Factory 範例:CookieValueProviderFactory

public class CookieValueProviderFactory : ValueProviderFactory
{
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        var cookies = controllerContext.HttpContext.Request.Cookies;
        var dict = cookies.AllKeys.ToDictionary(k => k, k => (object)cookies[k].Value);
        return new DictionaryValueProvider<object>(dict, CultureInfo.InvariantCulture);
    }
}

// 註冊於 Global.asax
ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
// 或插入特定位置調整優先級
ValueProviderFactories.Factories.Insert(2, new CookieValueProviderFactory());

UML 關係圖

ValueProvider、Factory、Factories UML 關係圖

三層架構總結

  • ValueProvider:實際資料存取介面 (ContainsPrefix, GetValue)。
  • ValueProviderFactory:建立 ValueProvider 的工廠,隔離建構邏輯。
  • ValueProviderFactories:全域 Factory 集合,決定優先級順序。

總結

ValueProvider 體系採工廠模式分離建構與使用,六大內建 Factory 涵蓋主流資料來源。自訂 Factory 可輕鬆擴充新資料來源(Cookie、Header、Session 等),透過集合順序控制優先級,完美符合開放封閉原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved