前言

本文不想过多篇幅来介绍IEnumerator和IEnumerable这两个接口的具体说明,只是把它作一个例子作引言而已,本文将根据自己的理解来描述微软为何要这样设计这种关联风格的接口。这种风格的接口还有IFormatProvider和IFormattable等等,总结这些所见,可简单描述为I[xx]er接口往往是用于定义[xx]业务方法,而I[xx]able定义一些方法,方法体的参数或返回参是I[xx]er类型,或者定义一些I[xx]er的相关属性,但其本身并不用去关注[xx]的业务。

I[xx]er接口的产生

webApi要把一些Model变成文本内容输出到客户端,从Model->文本内容,有很多种格式,但不管怎样,有请求了必须要回复,请求头信息里如果指明是json,就要Model->json,如果指明是xml,则要Model->xml;

这个场景可以理解为I[xx]er接口场景,这里我们可以定义为ISerializer

    /// <summary>
/// 定义对象的对象转换到文本的接口
/// </summary>
public interface ISerializer
{
/// <summary>
/// 序列化为文本内容
/// </summary>
/// <param name="model">实体</param>
/// <returns></returns>
string Serialize(object model);
}

对于不同格式的文本要求,比如json和xml,可以分别各实现一个ISerializer。

I[xx]able接口的产生

微软有个苦B的程序员在实现WebApi时,领导要求他实现上面的ISerializer把Model转换为Json,由于时间很紧张,所以他匆匆的写了一下,简单的贫血Model能转为json了,但复杂的Model还是转不了,有自知之明的他于是它就想出一种方案,让使用上层开发WebApi的人员可以替换掉他写的这个序列化器,比如用JSON.net来实现并替换。于是他定义于了ISerializable这个接口:

    /// <summary>
/// 由于时间不够,默认的Serializer很差
/// 请上层开发人员自己替换掉Serializer
/// </summary>
public interface ISerializable
{
/// <summary>
/// 获取或设置序列化工具
/// </summary>
ISerializer Serializer { get; set; }
}

其它同事问他,你把ISerializer Serializer { get; set; }直接做为WebApi的一个属性就行了,干吗要定出一个无聊的ISerializable接口出来,只见他慢慢地泡了一壶咖啡,然后答:你以为开发完了WebApi就结束了?以后还有CloudApi和HoloLensApi等等,都等着我们来开发呢,我想让这些都实现我的ISerializable接口,让我们的开发人员可以写个扩展方法就可以方便地把ISerializer Serializer这个属性替换,他脑海里出现了下面的扩展方法:

    public static class Extend
{
public static void ReplaceSerializer(this ISerializable apiServer, ISerializer betterSerializer)
{
apiServer.Serializer = betterSerializer;
}
}

后记

以上都是不存在的场景,为本人YY而已,大家能感受到这种设计的思想就好了。我也是最近才遇到这种场景,我的设计如下:

/// <summary>
/// 定义支持依赖注入接口
/// </summary>
public interface IDependencyResolverSupportable
{
/// <summary>
/// 获取或设置依赖注入提供者
/// </summary>
IDependencyResolver DependencyResolver { get; set; }
}
/// <summary>
/// 定义支持过滤器的接口
/// </summary>
public interface IFilterSupportable
{
/// <summary>
/// 获取全局过滤器管理者
/// </summary>
IGlobalFilters GlobalFilters { get; } /// <summary>
/// 获取或设置Api行为特性过滤器提供者
/// </summary>
IFilterAttributeProvider FilterAttributeProvider { get; set; }
}
  /// <summary>
/// 快速构建Tcp服务端接口
/// </summary>
public interface IFastTcpServer : ITcpServer<FastSession>, IDependencyResolverSupportable, IFilterSupportable
{
}

博主现在有意寻一份职位,弟兄们有好的介绍可以推荐一下给我,谢谢。

理解IEnumerator+IEnumerable这种接口思想的更多相关文章

  1. IEnumerable和IEnumerable<T>接口

    IEnumerable和IEnumerable<T>接口 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach ...

  2. IEnumerable<T> 接口和GetEnumerator 详解

    IEnumerable<T> 接口 .NET Framework 4.6 and 4.5   公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代. 若要浏览此类型的.NET Frame ...

  3. 第28 章 : 理解容器运行时接口 CRI

    理解容器运行时接口 CRI CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI ...

  4. IEnumerator/IEnumerable接口

    IEnumberator函数成员 Current返回序列中当前位置项的 属性 只读属性 返回object类型 MoveNext把枚举器位置前进到集合中下一项的方法 新位置有效返回true,否则fals ...

  5. 我是如何理解Java抽象类和接口的

    在面试中我们经常被问到:Java中抽象类和接口的区别是什么? 然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦:一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好 ...

  6. 迭代器模式 与 C# IEnumerator/IEnumerable

    Part1 迭代器模式 与 接口 IEnumerable IEnumerator interface IEnumerable { IEnumerator GetEnumerator(); } // 泛 ...

  7. 【blade的UI设计】理解前端MVC与分层思想

    前言 最近校招要来了,很多大三的同学一定按捺不住心中的焦躁,其中有期待也有彷徨,或许更多的是些许担忧,最近在开始疯狂的复习了吧 这里小钗有几点建议给各位: ① 不要看得太重,关心则乱,太紧张反而表现不 ...

  8. 理解Java中的接口

    一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...

  9. 简单理解Linux的Loopback接口

    Linu支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通TCP/IP进行通信. A 类网络127就是为环回接口预留的 .根据惯例,大多数系统把I ...

随机推荐

  1. .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构

    阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...

  2. df,du,mount

    df 查看当前系统中文件系统的使用情况 $df [-aTh]缺省选项查看当前系统的所有文件系统 -a列出所有的信息 -T列出文件系统类型 -hhuman-readable,用合适的单位表示大小 $df ...

  3. Centos和Redhat的区别和联系

    网上看到的,转载给大家 CentOS与RedHat的关系: RedHat在发行的时候,有两种方式:二进制的发行方式以及源代码的发行方式.无论是哪一种发行方式,你都可以免费获得(例如从网上下载),并再次 ...

  4. 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮

    定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...

  5. 支付宝APP支付开发- IOException : DER input, Integer tag error

    支付宝APP支付Java开发报错: 1 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: I ...

  6. 【转】Linux Mint 17.2 gedit中文乱码

    转自:linux mint 14 gedit 中文乱码 Mint默认没安装gconf-editor,搜了下,找到如下解决办法 在终端下执行语句: gconftool- --set --type=lis ...

  7. C语言中内存分配那些事儿

    C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉, ...

  8. mysql 将列值转变为列的方法(转)

    转自http://www.jb51.net/article/36497.htm -- 创建库CREATE TABLE `rate` ( `uname` VARCHAR (300), `object` ...

  9. 【转载】Android Metro风格的Launcher开发系列第二篇

    前言: 各位小伙伴们请原谅我隔了这么久才开始写这一系列的第二篇博客,没办法忙新产品发布,好了废话不说了,先回顾一下:在我的上一篇博客Android Metro风格的Launcher开发系列第一篇写了如 ...

  10. Windows Azure 虚拟机备份

    如果我们要在Windows Azure的虚拟机上进行一些“重要且高危”的操作,我们通常会想到使用快照或者备份功能.但是在Windows Azure上是没有虚拟机快照功能的,尽管我们可以对虚拟机的磁盘文 ...