网上Ninject的资料大都是MVC3或更早的,少有的几个MVC5的写的也挺麻烦的,又改 Global.asax 又自建解析器类什么的,自己尝试了一下,发现其实现在的Ninject的MVC5插件配置真的非常简单了,下面就来演示一下操作步骤:

首先创建Web项目:

image

类型设为MVC:

image

然后管理项目的NuGet包:

image

搜索Ninject,安装Ninject.MVC5

image

PS:NuGet服务器经常被墙,不成功就果断挂VPN吧。

可以看到安装程序包列表,接受之:

image

然后创建测试用的类型,首先是 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 文件:

image

编辑其代码,将我们的映射逻辑写进去,这里我们将 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>

运行效果:

image

注入成功。

怎样,是不是非常简单呢?

MVC版本信息:

image

分享或转载本博客站点内的所有原创内容时,都必须遵循此协议:

姓名标示-非商业性-相同方式分享 4.0 国际 (CC BY-NC-SA 4.0)

同时必须附加指向本文页面本博客首页的超链接。

除此之外的转载、分享方式都必须征得本博客作者的授权,否则将会诉诸法律。