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

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

     
     
    分类: ASP.NET MVCC#
    标签: C#.NET
  • 相关阅读:
    PHP操作目录(文件夹)的常用函数
    PHP处理时间的常用函数
    PHP操作文件的常用函
    PHP处理数组的常用函数
    PHP处理字符串的常用函数
    什么是 CGI?什么是 FastCGI?php-fpm,FastCGI,Nginx 之间是什么关系?
    一天一个 Linux 命令(18):ln 命令
    IntelliJ IDEA get set 快捷键
    mysql的一些问题记录
    数据库的乐观锁和悲观锁是什么?怎么实现的?
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3764950.html
Copyright © 2011-2022 走看看