网上Ninject的资料大都是MVC3或更早的,少有的几个MVC5的写的也挺麻烦的,又改 Global.asax 又自建解析器类什么的,自己尝试了一下,发现其实现在的Ninject的MVC5插件配置真的非常简单了,下面就来演示一下操作步骤:
首先创建Web项目:
类型设为MVC:
然后管理项目的NuGet包:
搜索Ninject,安装Ninject.MVC5
PS:NuGet服务器经常被墙,不成功就果断挂VPN吧。
可以看到安装程序包列表,接受之:
然后创建测试用的类型,首先是 I武器 接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MVC5配Ninject测试 { public interface I武器 { string 说明 { get; } } }
然后是实现接口的 手里剑 类:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVC5配Ninject测试 { public class 手里剑 : I武器 { public string 说明 { get { return "手里剑是日本对脱手 暗器的统称,脱手暗器就是出手后不再收回再次使用的暗器。"; } } } }
再来一个 太刀 类:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVC5配Ninject测试 { public class 太刀:I武器 { public string 说明 { get { return "太刀,具有较大弯曲度,刀身长3尺(1m)以上、5尺(约1.5m)不足的弯刀。其中3尺以下的称为小太刀,5尺以上的称为大太刀(或称野太刀)。"; } } } }
OK,下面去 App_Start 目录下找 NinjectWebCommon.cs 文件:
编辑其代码,将我们的映射逻辑写进去,这里我们将 I武器 接口映射到 太刀 类:
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MVC5配Ninject测试.App_Start.NinjectWebCommon), "Start")] [assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(MVC5配Ninject测试.App_Start.NinjectWebCommon), "Stop")] namespace MVC5配Ninject测试.App_Start { using System; using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject; using Ninject.Web.Common; public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// <summary> /// Starts the application /// </summary> public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } /// <summary> /// Stops the application. /// </summary> public static void Stop() { bootstrapper.ShutDown(); } /// <summary> /// Creates the kernel that will manage your application. /// </summary> /// <returns>The created kernel.</returns> private static IKernel CreateKernel() { var kernel = new StandardKernel(); try { kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); kernel.Bind<I武器>().To<太刀>(); RegisterServices(kernel); return kernel; } catch { kernel.Dispose(); throw; } } /// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { } } }
现在打开 Home 控制器的源代码(HomeController.cs),编辑之:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Ninject; namespace MVC5配Ninject测试.Controllers { public class HomeController : Controller { [Inject] public I武器 武器 { get; set; } public ActionResult Index() { ViewBag.武器 = 武器; return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } }
这样就完成了属性注入,并赋值到 Index 动作的 ViewBag 中,接下来编辑其对应的视图(Index.cshtml)以将其显示到页面:
@{ ViewBag.Title = "Home Page"; } <div class="jumbotron"> <h1>@ViewBag.武器.GetType().Name</h1> <p class="lead">@ViewBag.武器.说明</p> </div>
运行效果:
注入成功。
怎样,是不是非常简单呢?
MVC版本信息:
转载此文章时须注明转载自”SkyD(斯克迪亚)开发者博客“,并保留此文章的Url链接
目前还没有任何评论。