当前位置:编程学习 > asp >>

Asp.net MVC源码分析--Asp.net MVC与Ninject.MVC集成分析

 

在之前的文章中我们分析了DependencyResolver 与Service location. 可以利用DependencyResolver 来注册我们自己的IResolver实现,从而改变框架的行为.在Niject.MVC 中正是利用这个机制来实现了一套Service location机制,来创建Controller.

Niject.MVC 源码的下载地址是: https://github.com/ninject/ninject.web.mvc

------------------------------------------------------------------------------------------

首先我们找到NinjectMVC3.cs 文件,所有引入Niject.MVC dll 的asp.net MVC项目都需要这个类

 

 1 #if NUGET

 2 [assembly: WebActivator.PreApplicationStartMethod(typeof(SampleApplication.App_Start.NinjectMVC3), "Start")]

 3 [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(SampleApplication.App_Start.NinjectMVC3), "Stop")]

 4

 5 namespace SampleApplication.App_Start

 6 {

 7     using System.Reflection;

 8     using Microsoft.Web.Infrastructure.DynamicModuleHelper;

 9     using Ninject;

10     using Ninject.Web.Mvc;

11

12     public static class NinjectMVC3

13     {

14         private static readonly Bootstrapper bootstrapper = new Bootstrapper();

15

16         /// <summary>

17 /// Starts the application

18 /// </summary>

19         public static void Start()

20         {

21             DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));

22             DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));

23             bootstrapper.Initialize(CreateKernel);

24         }

25        

26         /// <summary>

27 /// Stops the application.

28 /// </summary>

29         public static void Stop()

30         {

31             bootstrapper.ShutDown();

32         }

33        

34         /// <summary>

35 /// Creates the kernel that will manage your application.

36 /// </summary>

37 /// <returns>The created kernel.</returns>

38         private static IKernel CreateKernel()

39         {

40             var kernel = new StandardKernel();

41             RegisterServices(kernel);

42             return kernel;

43         }

44

45         /// <summary>

46 /// Load your modules or register your services here!

47 /// </summary>

48 /// <param name="kernel">The kernel.</param>

49         private static void RegisterServices(IKernel kernel)

50         {

51             kernel.Load(Assembly.GetExecutingAssembly());

52         }        

53     }

54 }

55 #endif

我们看到当Assembly 加载后会调用WebActivator 的StartMethod方法来,启动NinjectMVC3.Start方法这个方法中调用了bootstrapper.Initialize方法.

www.zzzyk.com

在这Initialize方法中向kernel容器注入了很多接口的实现.并且向DependencyResolver中注册了Ninject的IDependencyResolver实现

DependencyResolver.SetResolver(CreateDependencyResolver());

最后我们就可以向Ninject注入所有MVC 框架中依赖DependencyResolver获取接口的实现.

并且当我们的Controller 的构造函数中有接口参数,并且在Ninject有注册的话,也可以顺利的创建Controller的参数中的接口(因为所有Controller的创建都通过Ninject),这样我们就可以把Controller中的一些业务行为抽取出来创建独立的类(业务层),从而划分出更清晰的类的层次结构和设计.

例如:

 

这时只要我们在Application_Strat 中向Iinject容器中注册IAccountManager 的实现AccountController就可以使用了.

 

摘自 十一月的雨

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,