NInject组件的使用及探究

NInject组件是.NET中实现控制反转(依赖注入)的组件。今天学习了一下NInject组件的使用,分别写了一个入门级别的Demo并且探究了下在ASP.NET MVC 中Controller加载过程中是如何使用NInject的。

1.NInject Demo

using System.Text;
using System.Threading.Tasks;
using Ninject;

namespace NInjectDemo
{
    interface ILogService
    {
        void PrintLog();
    }

    class LogService : ILogService
    {
        public void PrintLog()
        {
            Console.WriteLine("I am printing log.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel();
            kernel.Bind<ILogService>().To<LogService>();
            var logService = kernel.Get<ILogService>();
            logService.PrintLog();

            Console.ReadKey();
        }
    }
}
代码非常简洁,我们需要一个接口和一个实现了接口的类,然后我们使用IKernel的实例去绑定,然后获取实例,最后调用方法!

I am printing log.
2.在ASP.NET MVC 中通过一个kernel去获取所有继承自IController的对象的实例!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Ninject;

namespace AspNetMvcNInjectDemo
{
    interface ILogService
    {
        string PrintLog();
    }

    class LogService : ILogService
    {
        public string PrintLog()
        {
            return "I am printing log.";
        }
    }

    class NInjectControllerFactory : DefaultControllerFactory
    {
        private readonly IKernel _kernel;

        public NInjectControllerFactory()
        {
            _kernel = new StandardKernel();
            //AddBindings();
        }

        /*
        private void AddBindings()
        {
            _kernel.Bind<ILogService>().To<LogService>();
        }
        */

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            return controllerType == null ? null : (IController)_kernel.Get(controllerType);
        }
    }

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ControllerBuilder.Current.SetControllerFactory(new NInjectControllerFactory());
        }
    }
}

这与我在蒋金楠编写的《ASP.NET MVC5框架揭秘》中看到的关于ASP.NET MVC Controller的加载机制是一致的!

NInject把依赖注入的各种情形都做了很好的封装,使得我们使用起来还是非常方便的。


你可能感兴趣的:(kernel,Ninject)