程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC的Razor引擎:IoC在View激活過程中的應用

ASP.NET MVC的Razor引擎:IoC在View激活過程中的應用

編輯:關於ASP.NET

在《ASP.NET MVC的Razor引擎:RazorView》介紹BuildManagerCompiledView的時候,我們談到默認使用的ViewPageActivator使用當前注冊的DependencyResolver來完成對目標View的激活,這意味著我們可以通過注冊自定義DependencyResolver的方式實現基於IoC的View激活。本篇文章中我們將演示如何通過自定義View的方式實現與IoC框架Ninject的集成。

我們定義了一個具有如下定義的NinjectDependencyResolver,它具有一個IKernel類型的只讀屬性Kernel,該屬性在構造函數中被初始化為一個StandardKernel對象。對於實現的GetService和GetServices方法,我們直接調用Kernel的TryGet和GetAll返回指定類型的實例和實例列表。為了方便進行類型映射,我們定義了泛型的Register<TFrom,TTo>方法。

   1: public class NinjectDependencyResolver : IDependencyResolver
2: {
3: public IKernel Kernel { get; private set; }
4: public NinjectDependencyResolver()
5: {
6: this.Kernel = new StandardKernel();
7: }
8: public void Register<TFrom, TTo>() where TTo: TFrom
9: {
10: this.Kernel.Bind<TFrom>().To<TTo>();
11: }
12: public object GetService(Type serviceType)
13: {
14: return this.Kernel.TryGet(serviceType);
15: }
16: public IEnumerable<object> GetServices(Type serviceType)
17: {
18: return this.Kernel.GetAll(serviceType);
19: }
20: }

我們演示的是一個針對多語言支持的場景,為了讓View上輸出的一些內容隨著當前線程的UICulture而動態地變化,我們在一個ASP.NET MVC應用中定義如下一個讀取資源內容抽象類ResourceReader。這裡資源是一個寬泛的概念,並不對存儲方式作強制的約束,我們可以使用資源文件也可以使用數據庫來存儲資源內容。簡單起見,ResourceReader僅僅定義了一個唯一GetString方法獲取指定名稱的字符串。

   1: public abstract class ResourceReader
2: {
3: public abstract string GetString(string name);
4: }

我們默認采用資源文件來定義數據源,為此我們在項目中添加了兩個資源文件Resoures.resx(語言文化中性)和Resources.zh.resx(中文),並在資源文件中添加了如下圖所示的資源項(HelloWorld)。

然後我們創建如下一個默認的DefaultResourceReader,它默認讀取我們添加的資源文件來獲取GetString方法返回的字符串(靜態類型Resources是添加資源文件自動創建的類型)。

   1: public class DefaultResourceReader : ResourceReader
2: {
3: public override string GetString(string name)
4: {
5: return Resources.ResourceManager.GetString(name);
6: }
7: }

為了讓ResourceManager能夠應用到所有的View中,我們為整個應用的View創建了如下一個基類LocalizableViewPage<TModel>。該類型是WebViewPage<TModel>的子類,它具有一個類型為ResourceManager的屬性ResourceManager。由於該屬性上應用了Ninject.InjectAttribute特性,意味著該屬性會以“屬性注入”的方式被自動初始化。

   1: public abstract class LocalizableViewPage<TModel>: WebViewPage<TModel>
2: {
3: [Inject]
4: public ResourceReader ResourceReader { get; set; }
5: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved