上篇对于Razor视图引擎和视图的类型作了大概的讲解,想必你们对视图的自己也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让你们更了解的视图,最后还会简单的介绍一下自定义的视图辅助器是怎么定义和使用的。html
首先咱们来看一下要定义实现依赖注入的功能接口规范和默认实现,示例代码1-1.web
代码1-1框架
using System.Web.Mvc; using Ninject; namespace MvcApplication.Models { public interface IStringManage { MvcHtmlString CombinationString(string strPar1, string strPar2); } public class DefaultStringManage : IStringManage { public MvcHtmlString CombinationString(string strPar1, string strPar2) { return new MvcHtmlString(strPar1 + strPar2); } } }
在IStringManage类型中定义了CombinationString()方法,用于将两个字符串类型的数值拼接起来,DefaultStringManage类型就是默认实现了,这里就很少说了。this
下面咱们再来定义在编译时刻视图将要实现继承的类型,示例代码1-2spa
代码1-23d
using System.Web.Mvc; using Ninject; namespace MvcApplication.Models { public abstract class StringManageView : WebViewPage { [Inject] public IStringManage StringManage { get; set; } } }
这样的定义起初是不会有什么问题的,由于cshtml视图文件在编译时是继承自WebViewPage类型的,如今咱们要让cshtml视图所继承的类型是StringManageView,因此必须让StringmanageView继承自WebViewPage,由于WebViewPage是抽象类型,而咱们又不想实现什么因此要定义为抽象类型,在StringManageView类型中,我定义了IStringManage类型的属性StringMange,而且使用IoC框架中的Inject特性来描述它,使的在编译是能够经过IoC来实现属性的依赖注入。code
下面咱们来看一下视图代码,这里的视图代码仍是引用前面篇幅使用最多的一个示例,代码1-3和代码1-4htm
代码1-3blog
public ActionResult Index(List<Product> model) { ViewBag.StrPar1 = "This is"; ViewBag.StrPar2 = "ViewIoCCase"; return View(model); }
代码1-4继承
@inherits MvcApplication.Models.StringManageView @{ ViewBag.Title = "Index"; } <h2> Index</h2> @foreach (var item in Model) { <h3>ID: @item.ID Name:@item.Name</h3> } <h2>@StringManage.CombinationString(ViewBag.StrPar1, ViewBag.StrPar2)</h2>
控制器方法部分的代码定义是没有问题的,在代码1-4,也就是Index视图的定义中经过@inherits指令来使视图文件在编译时继承自某个类型,以及在下面的使用中用到了StringManage属性,而且还调用了方法,这里看起来都没什么问题,可是放在这里用就有问题了,由于上面使用了foreach来遍历Model,在咱们定义StringManageView的时候并无对Model的类型作约束什么的,而控制器方法中也是须要将List<Product>类型传递到视图的,这里就引发了冲突,图1.
图1
遇到这种状况咱们只需修改一下代码1-2中的定义,让Model类型是在编译时是可肯定的而不是object类型,来看代码1-5
代码1-5
public abstract class StringManageView : WebViewPage<dynamic> { [Inject] public IStringManage StringManage { get; set; } }
对的,让StringManageView实现泛型的WebViewPage就能够了,上个篇幅中视图的基类也都是这样定义的,不是说上面代码1-2定义的就是错误的,定义的没有错,只是应用的视图不合适,由于Index视图自己须要对Model作一些操做,又不想由于为视图添加的依赖注入功能而修改因此才会引发的这个错误,若是放在普通的视图里使用那是没有问题的。
上面这些都定义好了,下面咱们须要实现自定义的IDependencyResolver类型,目的在于绑定咱们须要进行依赖注入的功能模块到IoC中,代码1-6.
代码1-6
using Ninject; using System.Web.Mvc; namespace MvcApplication.CustomDependencyResolver { public class NinjectDependencyResolver:IDependencyResolver { private IKernel Kernel; public NinjectDependencyResolver() { Kernel = new StandardKernel(); AddBinding(); } private void AddBinding() { Kernel.Bind<Models.IStringManage>().To<Models.DefaultStringManage>(); } public object GetService(Type serviceType) { return this.Kernel.TryGet(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { return this.Kernel.GetAll(serviceType); } } }
对于代码1-6就不做过多的解释了,在控制器激活部分都讲解过近乎相似的注入封装类型。
最后咱们在Global.asax文件的Application_Start()方法中,将Model绑定器和NinjectDependencyResolver类型添加中MVC框架中,代码1-7
代码1-7
ModelBinders.Binders.Add(typeof(List<Product>), new CustomListModelBinder()); DependencyResolver.SetResolver(new CustomDependencyResolver.NinjectDependencyResolver());
最后看下结果,图2.
图2
实际上自定义视图辅助器就是扩展方法的定义,首先咱们来看定义,实现的功能同代码1-1相同,代码2-1
using System.Web.Mvc; namespace MvcApplication.CustomHtmlHelper { public static class MyCustomHtmlHelper { public static MvcHtmlString CombinationString(this HtmlHelper htmlHelper, string strPar1, string strPar2) { return new MvcHtmlString(strPar1 + strPar2); } } }
代码2-1这样的一个类型也就是自定义视图辅助器了,固然了这只是一个简单的示例,如今咱们须要把它在视图中使用起来,咱们得先把这个自定义的视图辅助器所在的命名空间添加到Views文件中的Web.Config中,代码2-2.
代码2-2
<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="MvcApplication.CustomHtmlHelper"/> </namespaces> </pages> </system.web.webPages.razor>
而后是在视图中引用扩展方法所处的命名空间, 这样配置事后就能够在视图用运用了咱们刚刚自定义的视图辅助器了,代码2-3.
代码2-3
@inherits MvcApplication.Models.StringManageView @using MvcApplication.CustomHtmlHelper @{ ViewBag.Title = "Index"; } <h2> Index</h2> @foreach (var item in Model) { <h3>ID: @item.ID Name:@item.Name</h3> } <h2>@StringManage.CombinationString(ViewBag.StrPar1, ViewBag.StrPar2)</h2> @Html.CombinationString("This is a ","Case")
最后咱们看一下结果如图3.
图3
做者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面