理解IEnumerator+IEnumerable这种接口思想
前言
本文不想过多篇幅来介绍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这种接口思想的更多相关文章
- IEnumerable和IEnumerable<T>接口
IEnumerable和IEnumerable<T>接口 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach ...
- IEnumerable<T> 接口和GetEnumerator 详解
IEnumerable<T> 接口 .NET Framework 4.6 and 4.5 公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代. 若要浏览此类型的.NET Frame ...
- 第28 章 : 理解容器运行时接口 CRI
理解容器运行时接口 CRI CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI ...
- IEnumerator/IEnumerable接口
IEnumberator函数成员 Current返回序列中当前位置项的 属性 只读属性 返回object类型 MoveNext把枚举器位置前进到集合中下一项的方法 新位置有效返回true,否则fals ...
- 我是如何理解Java抽象类和接口的
在面试中我们经常被问到:Java中抽象类和接口的区别是什么? 然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦:一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好 ...
- 迭代器模式 与 C# IEnumerator/IEnumerable
Part1 迭代器模式 与 接口 IEnumerable IEnumerator interface IEnumerable { IEnumerator GetEnumerator(); } // 泛 ...
- 【blade的UI设计】理解前端MVC与分层思想
前言 最近校招要来了,很多大三的同学一定按捺不住心中的焦躁,其中有期待也有彷徨,或许更多的是些许担忧,最近在开始疯狂的复习了吧 这里小钗有几点建议给各位: ① 不要看得太重,关心则乱,太紧张反而表现不 ...
- 理解Java中的接口
一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...
- 简单理解Linux的Loopback接口
Linu支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通TCP/IP进行通信. A 类网络127就是为环回接口预留的 .根据惯例,大多数系统把I ...
随机推荐
- SQL Server:数据库角色
除了上述固定数据库角色之外,还有一种特殊的固定数据库角色,名为public. 数据库的每个合法用户都必须属于public角色,它为数据库中的用户提供了所有默认权限. 一般情况下,public角色允许用 ...
- msysGit管理GitHub代码
msysGit管理GitHub代码 代码的管理,在日常开发中是很重要的环节,程序员的修炼三部曲——版本控制,单元测试,项目自动化. 本篇就简单的说说通过msysGit来管理GitHub中的代码,实 ...
- MongoDB Sharding、库、collection设计学习汇总
sharding设计须考虑的几个因素 Sharding Key的选择 在片键的选择上,最好是能够在字段中选择混合型的片键,大范围的递增健.和随机分布的健组合,如按月份递增.按用户名 ...
- JavaScript选项卡/页签/Tab的实现
选项卡,也称页签,英文用Tab(Module-Tabs)表示.Tab将不同的内容重叠放在一个布局块内,重叠的内容区里每次只有其中一个是可见的. Tab可以在相同的空间里展示更多的信息,它把相似的主题分 ...
- 怎么使PUTTY一直连接
如何才能保证PUTTY一直连接,即使我们好长时间不去敲命令,也让它一直连接着? PuTTY的设置方法是:在Connection里面有个Seconds between keepaliaves.这里就是每 ...
- Binary search tree
#ifndef __TREE_H #define __TREE_H #include <iostream> template<typename T> class TreeNod ...
- ELK日志解决方案安装配置与使用
官方网站:https://www.elastic.co/products/elasticsearch logstash,elasticsearch,kibana作用如下: logstash:分布在每一 ...
- Wish You to Remember
Just to myself: it is not complicate. And I don't know its internal principle now. (ms08-067) But I ...
- Protobuf语言指南(转)
Protobuf语言指南 l 定义一个消息(message)类型 l 标量值类型 l Optional 的字段及默认值 l 枚举 l 使用其他消息类型 l 嵌套类型 l 更新一个消息类型 ...
- 分层开发之MySchool
No.1实现登陆功能,验证用户名和密码.从数据库里进行匹配,看是否有符合要求的数据. 在DAL层编写代码,返回值为布尔类型.方法参数为(student实体类对象),使用参数化SqlParameter类 ...