在 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
在 MVC 中使用 ninject Lazy Load的一个想法的更多相关文章
- ASP.NET Web API和ASP.NET Web MVC中使用Ninject
ASP.NET Web API和ASP.NET Web MVC中使用Ninject 先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.Web ...
- 在ASP.NET Web API和ASP.NET Web MVC中使用Ninject
先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.WebUI的空MVC应用程序 3.使用NuGet安装Ninject库 二.在ASP.N ...
- ASP.NET MVC中使用Ninject
ASP.NET MVC中使用Ninject 在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事 ...
- 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject
本文参考:http://www.cnblogs.com/willick/p/3299077.html 1.在ASP.NET MVC中一个客户端请求是在特定的Controller的Action中处理的. ...
- MVC中使用Ninject依赖注入
在.NET MVC中使用Ninject注入,主要分为以下几步: 使用NuGet包添加Ninject引用,我添加的是目前最新版本3.34 在App_Start文件夹下,创建NinjectControll ...
- Ninject Lazy Load问题
参考: http://stackoverflow.com/questions/2538132/lazy-loading-with-ninject 方案一: public class Module : ...
- Asp.net MVC 中使用 Ninject 实现依赖注入
松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...
- 在ASP.NET MVC中使用jQuery的Load方法加载静态页面的一个注意点
使用使用jQuery的Load方法可以加载静态页面,本篇就在ASP.NET MVC下实现. Model先行: public class Article { public int Id { get; s ...
- Ninject Lazy Load
namespace LayzyLoadTest { [TestClass] public class UnitTest1 { private IKernel InitKernel() { Ninjec ...
随机推荐
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- 在线HTTP POST/GET接口测试工具
在线HTTP POST/GET接口测试工具 http://www.atool.org/httptest.php
- java游戏制作之水果忍者
水果忍者的原理很简单,主要就是采用随机的方式是画面上面出现水果. package Fruitninja; import java.awt.Dimension; import java.awt.Grap ...
- python数据字典的操作
一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器 ...
- eclipse egit(分支管理 下)
在Git的分支merge中,不可能没有代码的冲突问题,特别在跟别人分工合作时.那该怎么解决? 1.新建一个conflict分支,在dev方法下添加一句 System.out.println(“Crea ...
- Theos简介
[Theos简介] Theos is a cross-platform suite of development tools for managing, developing, and deployi ...
- 1-3 并发与高并发基本概念.mkv
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
- sqLSERVER 计划缓存
在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用.在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划.那个执行计划然后会被缓存,即被称为计划 ...
- CSS概念 - 可视化格式模型(二) 定位概述(普通流、绝对定位)
2.定位概念 上一节熟悉了盒模型, 现在来看一下可视化格式模型和定位模型. 理解这两个模型的细微差异是非常重要的, 因为它们一起控制着如何在页面上布置每个元素 2.1 可视化格式模型 CSS有三种基本 ...