理解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 { }
博主现在有意寻一份职位,弟兄们有好的介绍可以推荐一下给我,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?