zoukankan      html  css  js  c++  java
  • 在 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

  • 相关阅读:
    oracle-PL/SQL1
    ROS之Gazebo
    ROS之urdf 2
    ROS之urdf 1
    ROS 面部识别
    ROS x Arduino
    STM32F0的低功耗模式
    项目进度
    C++函数返回为引用
    STM32F0的多路ADC 无DMA
  • 原文地址:https://www.cnblogs.com/zbw911/p/3173553.html
Copyright © 2011-2022 走看看