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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

 
 
分类: ASP.NET MVCC#
标签: C#.NET

Lambda表达式、依赖倒置的更多相关文章

  1. 【Java8新特性】- Lambda表达式

    Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...

  2. ASP.NET MVC学前篇之Lambda表达式、依赖倒置

    ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...

  3. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

  4. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

  5. 深入浅出java 8 lambda表达式--零基础一分钟入门

    lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如: public static void main(String[] args) { PlatformQuery ...

  6. 定制操作(传递函数或lambda表达式)

    很多算法都会比较输入序列中的元素.默认情况下,这类算法使用元素类型的<或==运算符完成比较.标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认运算符. 例如,sort算法默 ...

  7. C++11中新特性之:lambda 表达式

    首先摆出Lambda表达式语法 lambda-expression: lambda-introducer lambda-declaratoropt compound-statementlambda-i ...

  8. [Java 8] (5) 使用Lambda表达式进行设计

    使用Lambda表达式进行设计 在前面的几篇文章中,我们已经见识到了Lambda表达式是怎样让代码变的更加紧凑和简洁的. 这一篇文章主要会介绍Lambda表达式怎样改变程序的设计.怎样让程序变的更加轻 ...

  9. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

随机推荐

  1. Oracle性能优化学习笔记WHERE在连接顺序的条款

     ORACLE自下而上分析顺序WHERE条款,根据这一原理,表之间的连接必须写在其它WHERE先决条件, 这些条件可以过滤掉要被写入记录的最大数目WHERE在条款结束. 比如:        (低效, ...

  2. 设计模式Template Method模式(Template Method)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  3. ACM-凸多边形的计算几何——hrbust1429

    凸多边形 称号:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1429 Descri ...

  4. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  5. Android使用surface直接显示yuv数据(三)

    在本文中,Java创建UI和关节JNI经营层surface直接显示yuv数据(yv12).发展环境Android 4.4,驰A23平台. package com.example.myyuvviewer ...

  6. 编译器神vim改头换面

    我相信,农民听到两件神器码,首先emacs,首先vim.大家都知道e党和v党总是吵架.竟,这无助于嘈杂.只是每个人都有自己的道理也适用.在接触vim,同时联系emacs.对于作家,我认为vim更适合. ...

  7. linux_sed 正则替换

    目标 替换 test.data文件中的 原正则: (\d{4}[^)]*?) sed不支持 \d 改为0-9 测试 :head test.data| sed -r "s/([0-9]{4}[ ...

  8. Android 自己的自动化测试(5)&lt;robotium&gt;

    大约Android自己的自动化测试UI测试,前出台Android 自己主动化測试(4)<uiautomator>, 在android原生的单元測试框架上,利用uiautomator.jar ...

  9. Contoso 大学 - 使用 EF Code First 创建 MVC 应用,实例演练

    Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Contoso 大学是虚构的.应用包括了类似学生注册.课程创建以及教师分配等功能. 这个系 ...

  10. CSS3之重新定义鼠标右键

    效果图: html: <div id="rightkey"> <ul> <li><img src="images/xmgl.pn ...