• 在 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

  • 相关阅读:
    第一章 初识shiro
    LDAP概念
    css定位
    css随笔1
    自己动手实现信息检索系统
    IntelliJ IDEA和pycharm注册码
    俄罗斯农夫算法
    [NOIP2013]转圈游戏
    [codevs1287]矩阵乘法
    [洛谷1314]无序字母对
  • 原文地址:https://www.cnblogs.com/zbw911/p/3173553.html
Copyright © 2020-2023  润新知