ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用
在《ASP.NET MVC的Razor引擎:RazorView》介绍BuildManagerCompiledView的时候,我们谈到默认使用的ViewPageActivator使用当前注册的DependencyResolver来完成对目标View的激活,这意味着我们可以通过注册自定义DependencyResolver的方式实现基于IoC的View激活。本篇文章中我们将演示如何通过自定义View的方式实现与IoC框架Ninject的集成。[本文已经同步到《How ASP.NET MVC Works?》中]
我们定义了一个具有如下定义的NinjectDependencyResolver,它具有一个IKernel类型的只读属性Kernel,该属性在构造函数中被初始化为一个StandardKernel对象。对于实现的GetService和GetServices方法,我们直接调用Kernel的TryGet和GetAll返回指定类型的实例和实例列表。为了方便进行类型映射,我们定义了泛型的Register TFrom,TTo 方法。
1: public class NinjectDependencyResolver : IDependencyResolver
我们演示的是一个针对多语言支持的场景,为了让View上输出的一些内容随着当前线程的UICulture而动态地变化,我们在一个ASP.NET MVC应用中定义如下一个读取资源内容抽象类ResourceReader。这里资源是一个宽泛的概念,并不对存储方式作强制的约束,我们可以使用资源文件也可以使用数据库来存储资源内容。简单起见,ResourceReader仅仅定义了一个唯一GetString方法获取指定名称的字符串。
我们默认采用资源文件来定义数据源,为此我们在项目中添加了两个资源文件Resoures.resx(语言文化中性)和Resources.zh.resx(中文),并在资源文件中添加了如下图所示的资源项(HelloWorld)。
然后我们创建如下一个默认的DefaultResourceReader,它默认读取我们添加的资源文件来获取GetString方法返回的字符串(静态类型Resources是添加资源文件自动创建的类型)。
为了让ResourceManager能够应用到所有的View中,我们为整个应用的View创建了如下一个基类LocalizableViewPage TModel 。该类型是WebViewPage TModel 的子类,它具有一个类型为ResourceManager的属性ResourceManager。由于该属性上应用了Ninject.InjectAttribute特性,意味着该属性会以“属性注入”的方式被自动初始化。
接下来我们定义了如下一个简单的HomeController,其默认的Action方法Index中直接将对应的View呈现出来。
如下所示的是Action方法Index对应View的定义,我们使用@inherits指令让动态编译生成的View类型继承自我们自定义的基类LocalizableViewPage object 。我们直接调用ResourceReader属性的GetString方法提取名称为“HelloWorld”的字符串资源内容显示出来。
我们采用基于URL的语言文化决定机制,即将语言文化的代码置于请求URL中来决定希望采用的语言。为此我们在自动生成的RouteConfig类型中注册了如下一个URL模板为“{culture}/{controller}/{action}”的路由对象。
我们自定义的DefaultResourceReader能够根据当前线程的UICulture选择对应的资源文件,那么我们只需要根据请求地址指示的语言文件对当前线程的语言文件进行相应的设置即可。于是我们在Global.asax定义了如下一个Application_BeginRequest方法使HttpApplication的BeginRequest事件触发的时候从请求地址中提取语言文化代码,然后对当前线程的语言文化进行相应的设置。除此之外,针对NinjectDependencyResolver的注册和ResourceReader与Default ResourceReader之间的映射关系定义在Application_Start方法中。
6: NinjectDependencyResolver dependencyResovler = new NinjectDependencyResolver();
13: HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current);
14: string culture = RouteTable.Routes.GetRouteData(contextWrapper).Values["culture"] as string;
现在运行我们的程序,并通过地址指定采用的语言文化,我们可以发现呈选出来的内容与你指定的语言文化是一致的,具体的输出效果如下图所示。
ASP.NET MVC的Razor引擎:View编译原理
ASP.NET MVC的Razor引擎:RazorView
ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用
ASP.NET MVC的Razor引擎:RazorViewEngine
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 原文链接
asp.net core重新加载应用配置 asp.net core重新加载应用配置Intro#我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配置的接口。
在Azure中创建asp.net core 应用 0、前言 在玩转Azure之前首先大家要有Azure账号,或者可以先申请一下微软的账号,然后进行与Azure的关联(azure账号是免费的)。但是关联的步骤还是很有意思的,他需要VISA国际信用卡(我申请的是国际版的账号),楼主我本身就是大土豪(搞得好像很有钱似的), 重来不申请什么国际信用卡,都是国内银联信用卡搞的溜溜的,好吧为了搞一下azure,就申请了一张招商银行的VISA全币种国际信息卡(此处打个广告),不出3天就到了。
Java Spring Boot开发实战系列课程【第7讲】:Spring Boot 2.0安全机制与MVC身份验证实战(Java面试题) 立即下载
相关文章
- 使用Filter跟踪Asp.net MVC页面加载时间
- ASP.NET窗体身份验证对请求失败。原因:提供的票证已过期/无效
- Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
- Asp.Net_HttpModule的应用
- ASP.NET MVC中实现JSONP
- centos eclipse java.net.UnknownHostException: mysql: 未知的名称或服务
- Asp.Net Core 第03局:Startup
- .Net商品管理(注释,百度,提问,对比,总结)
- .NET(C#) 反射使用总结
- .NET Core(C#) 编写Console控制台程序示例代码
- .NET Core Entity Framework Core 多线程中使用Context报错问题
- .Net(C#) CefSharp Chrome 浏览器控件后台执行Iframe中的Js代码的方法
- .NET Core Dapper(ORM) 执行sql语句和事物(Transaction)
- ASP.NET MVC的Razor引擎:RazorViewEngine
- ASP.NET MVC下基于异常处理的完整解决方案
- [.NET] 利用 async & await 的异步编程
- C# post数据时 出现如下错误: System.Net.WebException: 操作超时
- .net 6简单使用NPOI 读取 Excel 案例+流程
- .net sdk 下载
- ASP.NET core webapi创建案例 _平台:windows (1)
- 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持
- .Net中偶尔需要使用异步的处理