前言

本文不想过多篇幅来介绍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. Using Confluent’s JDBC Connector without installing the entire platform

    转自:https://prefrontaldump.wordpress.com/2016/05/02/using-confluents-jdbc-connector-without-installin ...

  2. mysql密码相关

    Windows中修改密码在不同场景下,有以下几种方案: 方法1:用SET PASSWORD命令,具体更新密码步骤如下: c:>mysql -u root   mysql>set passw ...

  3. js中json对象和字符串的转换

    JSON.parse() : 字符串-->json对象 var str = '{"name":"huangxiaojian","age" ...

  4. IIS中查看W3P.exe进程对应的应用程序池的方法

    对于IIS6可以运行 iisapp -a来显示应用程序池的性能列表. iisapp.vbs它是一个脚本程序,在安装2003时需要SP1才有 而IIS7可以直接用它的外壳命令 C:"Windo ...

  5. Device ehth0 is not present

    context: 使用virtualbox 克隆了一个新硬盘,然后配为新建虚机的使用,但ifconfig只能发现lo,没有eth0 解决方案: 当前系统是centos6.6 cd /etc/udev/ ...

  6. 在报表中给session赋值实现报表间参数共享

    1. 问题描述 在报表开发工具FineReport中,若有几张不同的报表,每张报表都有一个共同的项可以选择,比如日期时间.我们希望选择了第一张报表的时间之后,其他报表的默认时间都变为第一张报表选择的时 ...

  7. unix automake 使用,快速生成你的Makefile

    使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...

  8. 三维网格去噪算法(L0 Minimization)

    [He et al. 2013]文章提出了一种基于L0范数最小化的三角网格去噪算法.该思想最初是由[Xu et al. 2011]提出并应用于图像平滑,假设c为图像像素的颜色向量,▽c为颜色向量的梯度 ...

  9. C# Interlocked 笔记

    无锁代码下,在读写字段时使用内存屏障往往是不够的.在 64 位字段上进行加.减操作需要使用Interlocked工具类这样更加重型的方式.Interlocked也提供了Exchange和Compare ...

  10. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...