阅读本文你的收获
- 了解C#中的扩展方法机制
- 学会在ASP.NET Core 中,用扩展方法封装服务配置,使得代码更加简洁
一、什么是扩展方法
扩展方法使能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法的特点
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。
如何定义扩展方法
它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
例子:将字符串转换为Int
//EString类里有一个ToInt的静态方法,
//他接收一个自身参数this,类型为string,this string必须在方法参数的第一个位置
namespace WebApplication1.Extensions.StringEx
{
public static class EString
{
///<summary>
///将字符串转换为Int
///</summary>
///<paramname="t"></param>
///<returns>当转换失败时返回0</returns>
public static int ToInt(this string t)
{
int id;
int.TryParse(t, out id); //这里当转换失败时返回的id为0
return id;
}
}
}
using WebApplication1.Extensions.StringEx;
//使用ToInt扩展方法
string str="123";
str.ToInt(); //编译时会转换成:EString.ToInt(str);
分析:string类型里面本身没有ToInt方法,通过扩展方法,给string类型扩展了一个ToInt()方法
二、实用案例:在ASP.NET Core当中封装Swagger的配置
开发环境:
操作系统: Windows 10 专业版
平台版本是:.NET 6
开发框架:ASP.NET Core WebApi
开发工具:Visual Studio 2022
首先,在没有用扩展方法封装前,Swagger的配置在Program.cs中如下:
思考一下:如果所有的服务配置都直接写在Program.cs中,那么势必会使得Program.cs代码变得很长,很乱。这样就会使得后期的维护越来越难。此时,我们可以使用扩展方法,将Swagger的配置封装到一个单独的类中,代码如下:
//在表现层里面,新建以下类,并写一个扩展方法SwaggerSetup
/// <summary>
/// Swagger配置 扩展方法
/// </summary>
public static class SwaggerExtensions
{
/// <summary>
/// 扩展方法
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection SwaggerSetup( this IServiceCollection services)
{
services.AddSwaggerGen(opt =>
{
//swagger开发者信息
opt.SwaggerDoc("v1", new OpenApiInfo
{
Title = "XF.OAWeb.WebApi",
Version = "v1",
Contact = new OpenApiContact
{
Name = "幸福科技",
Email = "xftech@qq.com",
}
});
//如何在Swagger上显示中文注释呢?
//解决方法:读取XF.OAWeb.WebApi.xml文件里面的注释信息,显示在Swagger界面上
string xmlPath = AppDomain.CurrentDomain.BaseDirectory + "XF.OAWeb.WebApi.xml";
opt.IncludeXmlComments(xmlPath, true);
});
return services;
}
}
//在Program.cs中,把上图中红色框内的代码,改成调用该扩展方法
builder.Services.SwaggerSetup(); //配置Swagger服务
看了本文,你也可以用扩展方法的机制,将各种服务配置单独封装成一个扩展方法,将这些扩展方法放到不同的cs文件中,并放置在一个Extensions文件夹中,方便管理。
如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。