阅读本文你的收获

  1. 了解C#中的扩展方法机制
  2. 学会在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的配置

开发环境:

首先,在没有用扩展方法封装前,Swagger的配置在Program.cs中如下:
ASP.NET Core基础之用扩展方法封装服务配置-LMLPHP

思考一下:如果所有的服务配置都直接写在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文件夹中,方便管理。

如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。

01-25 08:24