这这里先声明一下,引用了一个 (http://www.edcourtenay.co.uk/musings-of-an-idiot/2012/11/23/lazy-binding-with-ninject) 的方法。
Ninject 在 完成 Bind 以后,会根据Scope 存于列表中。
例如: Bind<IA>().To<A>().InXXXXScope().
这里A 只是与IA建立了一个映射,A不会实例化,也不会调用A的构造。
当 IKernel.Get<IA>(),的时候,A的构造方法才会被执行调用。
假如: 构造方法 A(。。。。) 中有其它被绑定的类型
如 A(IB b,IC c,…..,IZ z)
当 Kernel.Get<IA>() 的时候, 先会执行 Kernel->Get<IA> ,…. <IZ>(),
所以,在 Get的时候,所有与构造相关的类型都会一一实例化,
如果 如果在MVC 是这样一种情况,
-- Controller( ServericeA, ServiceB )
ServericeA(DomainA,DomainB) ServiceB(DomainB,DomainC)
DomainA(Res1,Res2), DomainB(Res3,Res4) …………………………………
即使我们执行 Controller.ActionXX(….)
在使用 Ninject.作为 Controller 实例化控制器的时候,那可怕的就发生了,一系列对象就开始创建了,这样灾难性的问题就发生,第一慢,第二占用大量内存。
所以,我们要做了出一个在不改写代码的情况下,还要以使用Ninject 构造注入的方法,那就是使用 .NET 4.0 中出现的 Lazy<> 包装构造函数中的参数。
变成类似于 Controller(Lazy<ServiceA> ,Lazy<SerivceB>).
ServiceA(Lazy<DomainA>,Lazy<DomainB>)……………
这样所有类型成为Lazy Load 方式。
但是究竟在哪一层使用呢,
如果在 只在表现层上,意义好像不太大。
如果做业务层面上,好像靠谱一点了吧。
下面就不必要做了。
不过,哪里加,还是要再考虑下。
扩展:
延迟初始化 http://msdn.microsoft.com/zh-cn/library/vstudio/dd997286(v=vs.100).aspx