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

在《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: }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索kernel
, 动态添加view
, 属性
, 类型
, public
, getservice
, 资源
, 一个
WebViewPage
,以便于您获取更多的相关知识。

时间: 2024-08-18 03:23:49

ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用的相关文章

ASP.NET MVC的Razor引擎:RazorViewEngine

基于Web Form引擎的WebFormViewEngine和针对Razor引擎的RazorViewEngine都是抽象类型BuildManagerViewEngine的子类,而后者又继承自VirtualPathProviderViewEngine.在这里我们仅仅对实现在RazorViewEngine中View获取的逻辑进行简单介绍.由于Razor引擎下的View通过RazorView对象来表示,而RazorView通过View文件的虚拟路径来构建,所以RazorViewEngine的View获

ASP.NET MVC的Razor引擎:RazorView

Razor引擎具有两个核心的类型,一个是表示View本身的类型RazorView,另一个则是获取和创建它的RazorViewEngine,我们将用两篇文章对它们分别进行剖析.Razor引擎下的View通过类型RazorView表示,它与表示Web Form引擎View的类型WebFormView都是BuildManagerCompiledView的子类. 一.BuildManagerCompiledView 为了能够清楚地说明实现在BuildManagerCompiledView中的View激活

ASP.NET MVC的Razor引擎:View编译原理

通过.cshtml或者.vbhtml文件定义的View能够被执行,必须先被编译成存在于某个程序集的类型,ASP.NET MVC采用动态编译的方式对View文件实施编译.当我们在对ASP.NET MVC进行部署的时候,需要对.cshtml或者.vbhtml文件进行打包.针对某个View的第一次访问会触发针对它的编译,一个View对应着一个类型.我们可以对.cshtml或者.vbhtml进行修改,View文件修改后的第一次访问将会导致View的再一次编译.和ASP.NET 传统的编译方式一样,针对V

ASP.NET MVC 3: Razor中的@:和语法

原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor's @: and <text> syntax[原文发表时间] December 15, 2010 11:48 PM 这是我正在写的博文系列中的另一篇,涵盖ASP.NET MVC 3的一些新功能: ·        Razor中的新@模型关键字(10月19日) ·        Razor中的层(10月22日) ·        用Razor实现服务器端注释(11月12日)

一起谈.NET技术,ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等,但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: ActionR

ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过 前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等, 但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: Actio

返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor)

原文:返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor) [索引页][源码下载] 返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor) 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 3.0 新特性之 View(Razor): Razor 的语法 Razor 与 Model Razor 与布局 示例1.Razor 概述RazorDemoControl

ASP.NET MVC:Razor 引入命名空间

原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行尾不需要加分号,加上也无妨(不过得全加上). VB.Net @Imports MvcApplication83.Models @Imports MvcApplication83.Common 配置文件中引用 必须在 Views 文件夹中的 Web.config 文件中添加引用.见下图: 打开该文件,

用ASP.NET(C#版)编写聊天室的过程中,如何通过选择DropDownList中的颜色相来使得文本框中字体颜色变化

问题描述 用ASP.NET(C#版)编写聊天室的过程中,如何通过选择DropDownList中的颜色来使得文本框中字体颜色变化?并且文本框中带有颜色的字体能显示到聊天记录中,聊天记录是另一个aspx页面--新手求大神指导! 解决方案 解决方案二:制定css样式,用js或jquery控制css样式变化解决方案三:说明你的"聊天消息"的表示协议.解决方案四:引用2楼sp1234的回复: 说明你的"聊天消息"的表示协议. 就是不懂怎么说明啊?麻烦大神再说清楚一点!谢谢@@