在《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
,以便于您获取更多的相关知识。