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

ASP.NET MVC Razor 引擎:IoC 容器整合 View 激活流程 (Ninject 實戰)

     編輯:關於ASP.NET

背景:View 激活與 DependencyResolver

BuildManagerCompiledView 透過 IViewPageActivator 建立 View 頁面實例。預設 DefaultViewPageActivator 使用 DependencyResolver.Current 解析型別,若失敗則 Activator.CreateInstance。此機制允許透過自訂 IDependencyResolver 整合 IoC 容器。

自訂 NinjectDependencyResolver

public class NinjectDependencyResolver : IDependencyResolver
{
    public IKernel Kernel { get; private set; }
    public NinjectDependencyResolver() { Kernel = new StandardKernel(); }
    
    public void Register<TFrom, TTo>() where TTo : TFrom
        => Kernel.Bind<TFrom>().To<TTo>();
    
    public object GetService(Type serviceType) => Kernel.TryGet(serviceType);
    public IEnumerable<object> GetServices(Type serviceType) => Kernel.GetAll(serviceType);
}

// Global.asax 註冊
DependencyResolver.SetResolver(new NinjectDependencyResolver());

情境:多語系資源注入 View

1. 資源讀取抽象

public abstract class ResourceReader
{
    public abstract string GetString(string name);
}

2. 預設實作 (資源檔 .resx)

public class DefaultResourceReader : ResourceReader
{
    public override string GetString(string name)
        => Resources.ResourceManager.GetString(name); // 自動依 Culture 選擇 .resx
}

3. View 基類注入屬性

public abstract class LocalizableViewPage<TModel> : WebViewPage<TModel>
{
    [Inject] // Ninject 屬性注入標記
    public ResourceReader ResourceReader { get; set; }
}

4. 設定 View 預設基類 (Web.config)

<system.web.webPages.razor>
  <pages pageBaseType="MyApp.LocalizableViewPage">
    <namespaces>...</namespaces>
  </pages>
</system.web.webPages.razor>

5. Ninject 綁定註冊

var resolver = (NinjectDependencyResolver)DependencyResolver.Current;
resolver.Register<ResourceReader, DefaultResourceReader>();

6. View 中使用

@model MyModel
<h1>@ResourceReader.GetString("HelloWorld")</h1>

關鍵流程圖解

  1. 請求進入,Controller 執行回傳 ViewResult。
  2. RazorViewEngine.FindView 找到 .cshtml 虛擬路徑。
  3. RazorView.Render 呼叫 BuildManagerCompiledView.Render。
  4. DefaultViewPageActivator.Create 透過 DependencyResolver.Current.GetService(viewType) 解析。
  5. NinjectDependencyResolver.GetService → Kernel.TryGet 返回 LocalizableViewPage 實例。
  6. Ninject 偵測 [Inject] 屬性,自動注入 DefaultResourceReader 實例。
  7. View 執行渲染,呼叫 ResourceReader.GetString 取得當前文化資源字串。

優勢

  • View 具備完整 IoC 能力:建構子注入、屬性注入、方法注入。
  • 資源讀取抽象化,可輕鬆切換資源檔、資料庫、快取等實作。
  • 符合相依性反轉原則,View 不依賴具體資源實作。

總結

ASP.NET MVC Razor 引擎透過 IViewPageActivator + IDependencyResolver 開放 View 激活管線。自訂 NinjectDependencyResolver 並設定 View 基類與 [Inject] 屬性,即可實現 View 層級的相依性注入,優雅解決多語系、共用服務等跨領域關注點。

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