在 MVC 中使用 ninject Lazy Load的一个想法

这这里先声明一下,引用了一个 (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

posted @ 2013-07-05 13:50  张保维  阅读(246)  评论(0编辑  收藏  举报