Lambda表达式、依赖倒置
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

1 private bool Comparison(int num1, int num2)
2 {
3 if (num1 > num2)
4 {
5 return true;
6 }
7 else
8 {
9 return false;
10 }
11 }

1 Func<int, int, bool> ComparisonNum = new Func<int, int, bool>(Comparison);
2 Comparison(5, 3);//return true
上面的示例中明显,很简单的定义了Func<int,int,bool>这么一个类型的委托,ComparisonNum的含义就是要有两个int类型的参数并且返回值为bool类型的函数。这是最原始的一个版本,下面将演示怎么样的去过度到Lambda表达式。
示例代码1.1-2

1 Func<int, int, bool> ComparisonNum=
2 delegate(int num1,int num2)
3 {
4 if (num1 > num2)
5 {
6 return true;
7 }
8 else
9 {
10 return false;
11 }
12 };

1 ComparisonNum(3, 5);//return false
从代码1.1-2中可以看出,使用匿名委托和上面的那个1.1-1没有什么大大的区别,只不过匿名委托简便了一点。下面再来看使用Lambda表达式的示例。
示例代码1.1-3
1  Func<int, int, bool> ComparisonNum = (num1, num2) => { return num1 > num2; };
1.1-3代码中在=>左边的"(num1,num2)"是要使用的参数,根据Func<int, int, bool> 来定义的,实际应写为
示例代码1.1-4
1 Func<int, int, bool> ComparisonNum = (int num1,int num2) => { return num1 > num2; };
1.1-3使用的是简便的写法,因为有VS这么强大环境的支持,可以根据前面变量定义的委托类型,自动的设置为Lambda表达式参数类型,以求符合前面类型的定义,而=>的右边则是Lambda表达式的函数主体,同匿名委托一个道理。这一小节对Lambda只是作了很简单的一个示例,意在让读者基础的了解到这方面的内容,篇幅的原因就不多说了。
2. 依赖倒置原则
设计原则是在设计模式或者是框架设计中都有遵循着的。这一节就讲解一下依赖倒置原则的实现之一依赖注入。
在工作中学习中,面向抽象编程、依赖于抽象不依赖于具体这些话语是经常性的见到,本节中的示例都会涉及到这些概念,很简单的一个示例让大家有个了解。
1 public class Entity
2 {
3 }
这里先定义了一个实体类,只是用作演示,没有什么具体功能,

1 public class ObjectFactory
2 {
3 public Entity CreateObject()
4 {
5 return new Entity();
6 }
7 }

然后又定义一个工厂,用作获取到Entity类型的实例,

1 public class IocController
2 {
3 public static Entity GetEntity()
4 {
5 ObjectFactory entityFactory = new ObjectFactory();
6 return entityFactory.CreateObject();
7 }
8 }

这是一个控制器,客户端在获得Entity类型的唯一依赖,在客户端只会IocController.GetEntity();这样来获得Entity实例。而我们要做的就是降低IocController和ObjectFactory的耦合度,其它的都不需要管了。
如图1

这时候的依赖关系正如上图所示的这样,那就要靠依赖抽象去解耦了。

1 public interface IObjectFactory
2 {
3 Entity CreateObject();
4 }
5 public class ObjectFactory:IObjectFactory
6 {
7 public Entity CreateObject()
8 {
9 return new Entity();
10 }
11 }

是的,对ObjectFactory类型进行了抽象,有了IObjectFactory接口类型。
图2

这个时候在脑海中的图形是不是应该是如图2所示的那样,想象确实是美好的,但是现实却不是这样。

1 public class IocController
2 {
3 public static Entity GetEntity()
4 {
5 IObjectFactory entityFactory = new ObjectFactory();
6 return entityFactory.CreateObject();
7 }
8 }

这时候的依赖关系应该是像图3这样,
图3

感觉是不是很糟糕,没关系,稍作修改,让依赖合理的注入就可以完成解耦,

1 public class IocController
2 {
3 private static IObjectFactory objectFactory;
4
5 public static void SetObjectFactory(IObjectFactory objectfactory)
6 {
7 objectFactory=objectfactory;
8 }
9
10 public static Entity GetEntity()
11 {
12 return objectFactory.CreateObject();
13 }
14 }

这个时候的关系依赖图就像图2所示的那样了。 这里要说的就是在IocController中私有的静态字段和静态函数都可以转为实例的,在IocController中定义一个静态的IocController类型来实现自身的一个单例模式,然后调用实例方法。 因为是个示例,着重于依赖注入的解释就不完善这个类型了,就用语言描述一下, 这样的设计的思路就类似于ASP.NETMVC中ControllerBuilder的样子,也就是构造函数注入。实际在真正的应用中也不是这个样子的,会在下一篇中讲解。 这篇就讲到这里。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
Lambda表达式、依赖倒置的更多相关文章
- 【Java8新特性】- Lambda表达式
		
Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...
 - ASP.NET MVC学前篇之Lambda表达式、依赖倒置
		
ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...
 - 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测
		
概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...
 - 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
		
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
 - 深入浅出java 8 lambda表达式--零基础一分钟入门
		
lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如: public static void main(String[] args) { PlatformQuery ...
 - 定制操作(传递函数或lambda表达式)
		
很多算法都会比较输入序列中的元素.默认情况下,这类算法使用元素类型的<或==运算符完成比较.标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认运算符. 例如,sort算法默 ...
 - C++11中新特性之:lambda 表达式
		
首先摆出Lambda表达式语法 lambda-expression: lambda-introducer lambda-declaratoropt compound-statementlambda-i ...
 - [Java 8] (5) 使用Lambda表达式进行设计
		
使用Lambda表达式进行设计 在前面的几篇文章中,我们已经见识到了Lambda表达式是怎样让代码变的更加紧凑和简洁的. 这一篇文章主要会介绍Lambda表达式怎样改变程序的设计.怎样让程序变的更加轻 ...
 - Java8特性详解 lambda表达式 Stream
		
1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...
 
随机推荐
- Spring.NET程序
			
第一个Spring.NET程序 Spring.NET环境准备 pring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring. ...
 - oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)
			
匿名PL/SQL块回顾 DECLARE (可选) 定义在PL/SQL块中要使用的对象 BEGIN (必须) 执行语句 EXCEPTION (可选) 错误处理语句 END; (必 ...
 - (大数据工程师学习路径)第四步 SQL基础课程----约束
			
一.简介 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.本节实验就在操作中熟悉MySQL中的几种约束. 二.内容 1.约束分类 听名字就知道,约束是一种限制,它通过 ...
 - Windows 8 – Reason 442: Failed to enable Virtual Adapter
			
Cisco VPN on Windows 8.1 – Reason 442: Failed to enable Virtual Adapter https://supertekboy.com/2013 ...
 - asp.net学习之ado.net(连接模式访问)
			
原文:asp.net学习之ado.net(连接模式访问) ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...
 - 平原绫香  Hirahara Ayaka-Jupiter
			
我第一次听到平原绫香(Hirahara Ayaka)久石让在武道馆演唱会.她的歌声真的很震惊! 声音是如此的纯净,演唱会是如此的优雅.她着迷,只是如此美丽. 然后我去检查她的信息.发现Jupiter. ...
 - Nyoj  三国志(dijkstra+01背包)
			
描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中 ...
 - hdu   1251(字典树)
			
题目链接:http://acm.hdu.edu.cn/status.php?user=NYNU_WMH&pid=1251&status=5 Trie树的基本实现 字母树的插入(Inse ...
 - Redis实现高并发分布式序列号
			
使用Redis实现高并发分布式序列号生成服务 序列号的构成 为建立良好的数据治理方案,作数据掌握.分析.统计.商业智能等用途,业务数据的编码制定通常都会遵循一定的规则,一般来讲,都会有自己的编码规则和 ...
 - crawler_http关闭连接
			
1:ps aux|grep Spider4Test.jar 查看端口 2: lsof -p [端口号] 在爬虫运行期间如果看到 大量的 TIME_WAIT WAIT_CLOSE 说明请求关闭阻塞[ ...