可扩展性(Extensibility)
由于Flurl的大部分功能是通过扩展方法提供的,所以使用Flurl本身使用的相同模式来扩展非常容易。
扩展URL构建器
链式的URL生成器方法通常有三种重载:一种是扩展Flurl.Url
,一种是扩展System.Uri
以及扩展String
。所有这些扩展都应该返回修改后的Flurl.Url
对象:
public static Url DoMyThing(this Url url) {
// 使用url进行业务扩展
return url;
}
public static Url DoMyThing(this Uri uri) => new Url(uri).DoMyThing();
public static Url DoMyThing(this string url) => new Url(url).DoMyThing();
扩展Flurl.Http
链式的Flurl.Http
扩展方法通常包含4个,分别为:Flurl.Url
,System.Uri
,String
以及IFlurlRequest
。所有的都应该返回当前的IFlurlRequest
,以便进一步的链式扩展,如下:
public static IFlurlRequest DoMyThing(this IFlurlRequest req) {
// 可使用req.Settings, req.Headers, req.Url等属性进行业务处理
return req;
}
public static IFlurlRequest DoMyThing(this Url url) => new FlurlRequest(url).DoMyThing();
public static IFlurlRequest DoMyThing(this Uri uri) => new FlurlRequest(uri).DoMyThing();
public static IFlurlRequest DoMyThing(this string url) => new FlurlRequest(url).DoMyThing();
现在,你可以使用如下的方式调用自定义扩展的链式方法:
result = await "http://api.com"
.DoMyThing() // 字符串扩展方法
.GetAsync();
result = "http://api.com"
.AppendPathSegment("endpoint")
.DoMyThing() // Url扩展方法
.GetAsync();
result = "http://api.com"
.AppendPathSegment("endpoint")
.WithBasicAuth(u, p)
.DoMyThing() // IFlurlRequest扩展方法
.GetAsync();
在某些情况下,你可能还需要第五个重载:一个IFlurlClient
扩展。 如果您的扩展仅与Settings
或Headers
交互,请记住,它们的默认值存在于客户端级别。因此,为完整起见,您的扩展也应该支持客户端级别的默认值。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册