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 ,