源生成器:提高应用程序性能的利器

源生成器的好处很多。通过在编译时生成代码,可以减少运行时的反射和动态代码生成,从而提高应用程序的性能。有时候需要对程序进行AOT以及裁剪编译的dll也是需要用SG来处理的。

在开发程序时,Mapper对象映射是不可或缺的。常用的库可能包括AutoMapper、Maspter等第三方库。这些库功能强大,但由于内部实现存在反射,因此开发的程序就没办法进行AOT。因此,如果程序不是很复杂但又有很特殊的需求,建议使用SG来实现Mapper。

功能演示

这里我演示下自己开发的AutoDto生成DTO功能:

比如我们有一个User的类,需要生成UserDto。

public class User
{
    public string Id { get; set; } = null!;
    public string FirstName { get; set; } = null!;
    public string LastName { get; set; } = null!;
    public int? Age { get; set; }
    public string? FullName => $"{FirstName} {LastName}";
}

定义UserDto并标注特性:

[AutoDto<User>(nameof(User.Id))]//这里我们假设排除Id属性
public partial record UserDto;

就这样,源生成器将自动为我们生成对应的Dto:

partial record class UserDto
{
    /// <inheritdoc cref = "User.FirstName"/>
    public string FirstName { get; set; }
    /// <inheritdoc cref = "User.LastName"/>
    public string LastName { get; set; }
    /// <inheritdoc cref = "User.Age"/>
    public int? Age { get; set; }
}

并同时为我们生成一个简单的Mapper扩展方法:

public static partial class UsertouserDtoExtentions
{
    /// <summary>
    /// mapper to UserDto
    /// </summary>
    /// <returns></returns>
    public static UserDto MapperToUserDto(this User model)
    {
        return new UserDto()
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            Age = model.Age,
            FullName = model.FullName,
        };
    }
}

实现代码

static void GENDTO(Compilation compilation, ImmutableArray<SyntaxNode> nodes, SourceProductionContext context)

如果你对完整的实现感兴趣可以移步我的GitHub仓储,欢迎star https://github.com/vipwan/Biwen.AutoClassGen

以上代码就完成了整个源生成步骤,最后你可以使用我发布的nuget包体验:

<ItemGroup>
   <PackageReference Include="Biwen.AutoClassGen.Attributes" Version="1.3.6" />
   <PackageReference Include="Biwen.AutoClassGen" Version="1.5.2" PrivateAssets="all" />
</ItemGroup>

最后,你可以使用我发布的nuget包体验。当然,如果你对完整的实现感兴趣可以移步我的GitHub仓储,欢迎star https://github.com/vipwan/Biwen.AutoClassGen

热门手游下载