前言

本文不想过多篇幅来介绍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. Linux运维常用命令总结

    1.删除0字节文件 find -type f -size 0 -exec rm -rf {} \;   2.查看进程 按内存从大到小排列 PS -e   -o "%C   : %p : %z ...

  2. 烂泥:mysql5.5多实例部署

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成. 1. mysql多实例的原理 2. mysql多实例的特点 3. mysql多实例应用 ...

  3. 烂泥:Windows下安装与配置Nginx web服务器

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前几篇文章,我们使用nginx都是在linux环境下,今天由于工作的需要.需要在windows环境也使用nginx搭建web服务器. 下面记录下有关ng ...

  4. Linux多进程编程

    进程的状态 Linux进程有7种基础状态(两种running算一种),除了traced都可以用$ps命令查看,$ps可以查看的进程状态如下,更多进程状态信息参见Linux Process VS Thr ...

  5. android Eclipse执行项目提示错误: unable to execute dex: GC orerhead limit exceeded

    Eclipse执行项目提示错误: unable to execute dex: GC orerhead limit exceeded 解决方法: 找到Eclipse安装目录的文件,\eclipse\e ...

  6. ARM学习篇一 点亮LED

    要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该 ...

  7. C#笔记---动态类(Dynamic)应用

    背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应.那么我们就会想到通过C#的dynamic动态类来实现,如果大家注意的话一些ORM框架里 ...

  8. 北理工c语言单项选择题

    1.在函数中,只要说明了变量,就可为其分配存储单元 error:如auto和register类型的变量在定义它的函数被调用时才被分配存储单元 auto:默认的局部变量存储方式,(这种变量定义时在动态存 ...

  9. PHP之图像处理

    PHP中提供了一些对图像进行编辑处理的函数,其中最为典型的应用为随机图形验证码.图片水印以及数据统计中饼状图和柱状图的生成等 PHP中有的图形函数可以直接使用,但多数需要在安装了GD2函数库后才能使用 ...

  10. 洛谷U4807抽水机[最小生成树]

    题目背景 kkk被Farmer John和他的奶牛贝茜虐的很惨,然后她也想体验下一个Farmer的生活.但她又懒得种地,就选择养鱼. 题目描述 这些鱼都是热带鱼(废话),很娇贵(比kkk娇贵),要经常 ...