ASP.NET MVC学前篇之Lambda表达式、依赖倒置
ASP.NET MVC学前篇之Lambda表达式、依赖倒置
前言
随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面的xxx=>xx>yy这些到底是怎么用的?
依赖倒置原则的实现也会在本篇幅的最后来粗略的讲解一下。 本篇没有核心的主题,如果说要强制定义的话就是这些内容都是基础知识,是为了后续学习MVC框架做铺垫。
1 Lambda
Lambda表达式在日常的开发中很常见,使用Lambda表达式可以自由的定义函数体并且精简代码量,那么Lambda表达式是什么呢?
Lambda表达式是匿名函数,而匿名函数又是委托,所以lambda表达式就是委托。(编译成中间语言后有一点小小的区别,不过大致是一样的)
1.1 Lambda的定义
既然说到Lambda是委托了,那就的有个类型,这里我们使用的是.NET给我们提供的Fun<T>泛型委托,Fun<T>是带返回值的委托类型。
1.2 相互认识
示例代码1.1-1
- private bool Comparison(int num1, int num2)
- {
- if (num1 > num2)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- Func<int, int, bool> ComparisonNum = new Func<int, int, bool>(Comparison);
- Comparison(, );//return true
上面的示例中明显,很简单的定义了Func<int,int,bool>这么一个类型的委托,ComparisonNum的含义就是要有两个int类型的参数并且返回值为bool类型的函数。这是最原始的一个版本,下面将演示怎么样的去过度到Lambda表达式。
示例代码1.1-2
- Func<int, int, bool> ComparisonNum=
- delegate(int num1,int num2)
- {
- if (num1 > num2)
- {
- return true;
- }
- else
- {
- return false;
- }
- };
- ComparisonNum(, );//return false
从代码1.1-2中可以看出,使用匿名委托和上面的那个1.1-1没有什么大大的区别,只不过匿名委托简便了一点。下面再来看使用Lambda表达式的示例。
示例代码1.1-3
- Func<int, int, bool> ComparisonNum = (num1, num2) => { return num1 > num2; };
1.1-3代码中在=>左边的"(num1,num2)"是要使用的参数,根据Func<int, int, bool> 来定义的,实际应写为
示例代码1.1-4
- Func<int, int, bool> ComparisonNum = (int num1,int num2) => { return num1 > num2; };
1.1-3使用的是简便的写法,因为有VS这么强大环境的支持,可以根据前面变量定义的委托类型,自动的设置为Lambda表达式参数类型,以求符合前面类型的定义,而=>的右边则是Lambda表达式的函数主体,同匿名委托一个道理。这一小节对Lambda只是作了很简单的一个示例,意在让读者基础的了解到这方面的内容,篇幅的原因就不多说了。
2. 依赖倒置原则
设计原则是在设计模式或者是框架设计中都有遵循着的。这一节就讲解一下依赖倒置原则的实现之一依赖注入。
在工作中学习中,面向抽象编程、依赖于抽象不依赖于具体这些话语是经常性的见到,本节中的示例都会涉及到这些概念,很简单的一个示例让大家有个了解。
- public class Entity
- {
- }
这里先定义了一个实体类,只是用作演示,没有什么具体功能,
- public class ObjectFactory
- {
- public Entity CreateObject()
- {
- return new Entity();
- }
- }
然后又定义一个工厂,用作获取到Entity类型的实例,
- public class IocController
- {
- public static Entity GetEntity()
- {
- ObjectFactory entityFactory = new ObjectFactory();
- return entityFactory.CreateObject();
- }
- }
这是一个控制器,客户端在获得Entity类型的唯一依赖,在客户端只会IocController.GetEntity();这样来获得Entity实例。而我们要做的就是降低IocController和ObjectFactory的耦合度,其它的都不需要管了。
如图1
这时候的依赖关系正如上图所示的这样,那就要靠依赖抽象去解耦了。
- public interface IObjectFactory
- {
- Entity CreateObject();
- }
- public class ObjectFactory:IObjectFactory
- {
- public Entity CreateObject()
- {
- return new Entity();
- }
- }
是的,对ObjectFactory类型进行了抽象,有了IObjectFactory接口类型。
图2
这个时候在脑海中的图形是不是应该是如图2所示的那样,想象确实是美好的,但是现实却不是这样。
- public class IocController
- {
- public static Entity GetEntity()
- {
- IObjectFactory entityFactory = new ObjectFactory();
- return entityFactory.CreateObject();
- }
- }
这时候的依赖关系应该是像图3这样,
图3
感觉是不是很糟糕,没关系,稍作修改,让依赖合理的注入就可以完成解耦,
- public class IocController
- {
- private static IObjectFactory objectFactory;
- public static void SetObjectFactory(IObjectFactory objectfactory)
- {
- objectFactory=objectfactory;
- }
- public static Entity GetEntity()
- {
- return objectFactory.CreateObject();
- }
- }
这个时候的关系依赖图就像图2所示的那样了。 这里要说的就是在IocController中私有的静态字段和静态函数都可以转为实例的,在IocController中定义一个静态的IocController类型来实现自身的一个单例模式,然后调用实例方法。 因为是个示例,着重于依赖注入的解释就不完善这个类型了,就用语言描述一下, 这样的设计的思路就类似于ASP.NETMVC中ControllerBuilder的样子,也就是构造函数注入。实际在真正的应用中也不是这个样子的,会在下一篇中讲解。 这篇就讲到这里。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC学前篇之Lambda表达式、依赖倒置的更多相关文章
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- ASP.NET MVC学前篇之Ninject的初步了解
ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...
- ASP.NET MVC学前篇之请求流程
ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...
- Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径
Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...
- Log4net入门(ASP.NET MVC 5篇)
在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...
- 恕我直言你可能真的不会java第1篇:lambda表达式会用了么?
本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...
- ASP.NET MVC 路由篇二
轉載 http://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_route_2.html 7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会 ...
- 第16章 ASP.NET MVC 日志篇
本章主要介绍MVC中内置的错误处理.日志以及用来提升性能的监控工具 一.错误处理 当该网站忙于处理HTTP请求时,很多内容都会出错.幸运的是,MVC让错误处理工作变得相对简单了很多,因为MVC应用是运 ...
- Java-Lambda表达式第二篇认识Lambda表达式
接上面的方法引用和构造器引用: 3>引用某类对象的实例方法 @FunctionalInterface public interface Cut{ String cut(String str,in ...
随机推荐
- Cocos2d-x 生成真正的随机数
关于随机数 cocos2d-x 定义了一个宏 CCRANDOM_0_1 生成的是 [0, 1] 之间的值 因此,要生成 [0-100] 之间的数 CCRANDOM_0_1 * 100 生成 [ ...
- SOUI开发者论坛
http://www.lumaba.cn/forum.php?mod=forumdisplay&fid=2 需要的朋友可以上去交流.
- Mac下的类似apt-get的包管理工具Homebrew(笔记)
对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...
- F#之旅6 - 简单AV推荐系统
上回说到用F#来写爬虫,这只是F#学习第一阶段的第一步.最开始,就对第一阶段做了这样的安排: 1.爬虫爬取AV数据 2.数据处理和挖掘 3.数据可视化(使用ECharts) 4.推荐系统 第一步很快就 ...
- 关于linux服务器上搭建ftp服务的流程
小龙最近折腾了一个阿里云的服务器,买完了就要开始做那么多那么多的功课,小龙对ssh也是一知半解的状态,做个小笔记,发布下整个ftp服务的搭建过程,大神勿喷:) 一.aliyun Linux(Redha ...
- AudioSpecificConfig
2个字节. 下面蓝色的为AudioSpecificConfig部分: 000001e0h: 00 00 00 00 00 AF 0011 90 00 00 00 0F 09 00 02; .....? ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- WPF menu
MenuMenu的样式很简单,就是顶部的那个框,如下图 而其中的文字“文件”“图形”...是属于MenuItem的,要灵活使用MenuItem,就需要了解MenuItem.Role的作用 TopLev ...
- window10 office 手工完全卸载
在地址栏输入itellyou,点击第一个搜索结果,可以从微软官方网站下载office安装. 一下是一点需要注意到的地方: 本次安装的是office2016其它类似 下载解压有的目录结构: 如果你是x6 ...
- Perforce: 常用功能。
1. checkout fatherDir下所有一级子目录下名称为text.txt的文件到change list 1234: p4 edit -c 1234 -t text+k "fathe ...