<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      打造.NET平臺(tái)的Lombok:實(shí)現(xiàn)構(gòu)造函數(shù)注入、日志注入、構(gòu)造者模式代碼生成等功能

      在Java生態(tài)系統(tǒng)中,Lombok是一個(gè)非常受歡迎的庫(kù),它通過(guò)注解的方式大大減少了Java開(kāi)發(fā)者需要編寫的樣板代碼量。通過(guò)簡(jiǎn)單的注解,如@Data@Getter@Setter@AllArgsConstructor等,開(kāi)發(fā)者可以自動(dòng)生成getter/setter方法、構(gòu)造函數(shù)、toString方法等。這不僅提高了開(kāi)發(fā)效率,還減少了代碼中的冗余,使代碼更加簡(jiǎn)潔和易于維護(hù)。

      然而,在.NET生態(tài)系統(tǒng)中,雖然沒(méi)有直接等價(jià)于Lombok的官方庫(kù),但我們可以通過(guò)Roslyn源代碼生成器來(lái)實(shí)現(xiàn)類似甚至更強(qiáng)大的功能。本文將介紹如何在.NET平臺(tái)上構(gòu)建一個(gè)類似Lombok的代碼生成工具,實(shí)現(xiàn)構(gòu)造函數(shù)注入、日志注入、構(gòu)造者模式等代碼生成功能。

      為什么需要類似Lombok的工具?

      在現(xiàn)代軟件開(kāi)發(fā)中,我們經(jīng)常需要編寫大量重復(fù)的樣板代碼,例如:

      1. 依賴注入:為服務(wù)類編寫構(gòu)造函數(shù)注入代碼
      2. 數(shù)據(jù)傳輸對(duì)象(DTO):為實(shí)體類創(chuàng)建對(duì)應(yīng)的DTO類
      3. Builder模式:為復(fù)雜對(duì)象創(chuàng)建Builder構(gòu)建器
      4. 屬性訪問(wèn)器:為私有字段生成公共屬性
      5. 映射方法:在不同對(duì)象之間進(jìn)行屬性映射

      這些樣板代碼不僅占用大量時(shí)間編寫,還容易出錯(cuò)且難以維護(hù)。通過(guò)代碼生成工具,我們可以自動(dòng)化這些重復(fù)性工作,讓開(kāi)發(fā)者專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。

      Mud代碼生成器

      Mud代碼生成器是一套基于Roslyn的源代碼生成器,專門針對(duì).NET平臺(tái)設(shè)計(jì),提供了類似Lombok的功能,甚至更加豐富。它包含兩個(gè)主要組件:

      1. Mud.EntityCodeGenerator:實(shí)體代碼生成器,用于根據(jù)實(shí)體類自動(dòng)生成各種相關(guān)代碼
      2. Mud.ServiceCodeGenerator:服務(wù)代碼生成器,用于自動(dòng)生成服務(wù)層相關(guān)代碼

      這套工具通過(guò)在代碼中添加特定的特性(Attribute)標(biāo)記,然后在編譯時(shí)自動(dòng)生成相應(yīng)的代碼,大大減少了開(kāi)發(fā)者需要手動(dòng)編寫的代碼量。

      核心功能

      1. 生成構(gòu)造函數(shù)注入代碼

      在.NET的依賴注入系統(tǒng)中,構(gòu)造函數(shù)注入是最推薦的依賴注入方式。然而,手動(dòng)編寫構(gòu)造函數(shù)注入代碼可能會(huì)很繁瑣,特別是當(dāng)一個(gè)類需要注入多個(gè)服務(wù)時(shí)。

      Mud.ServiceCodeGenerator提供了多種注入特性,可以自動(dòng)生成構(gòu)造函數(shù)注入代碼:

      ConstructorInjectAttribute 字段注入

      使用[ConstructorInject]特性可以將類中已存在的私有只讀字段通過(guò)構(gòu)造函數(shù)注入初始化:

      [ConstructorInject]
      public partial class UserService
      {
          private readonly IUserRepository _userRepository;
          private readonly IRoleRepository _roleRepository;
          
          // 生成的代碼將包含:
          // public UserService(IUserRepository userRepository, IRoleRepository roleRepository)
          // {
          //     _userRepository = userRepository;
          //     _roleRepository = roleRepository;
          // }
      }
      

      LoggerInjectAttribute 日志注入

      使用[LoggerInject]特性可以為類注入ILogger類型的日志記錄器:

      [LoggerInject]
      public partial class UserService
      {
          // 生成的代碼將包含:
          // private readonly ILogger<UserService> _logger;
          // 
          // public UserService(ILoggerFactory loggerFactory)
          // {
          //     _logger = loggerFactory.CreateLogger<UserService>();
          // }
      }
      

      CacheInjectAttribute 緩存管理器注入

      使用[CacheInject]特性可以注入緩存管理器實(shí)例:

      [CacheInject]
      public partial class UserService
      {
          // 生成的代碼將包含:
          // private readonly ICacheManager _cacheManager;
          // 
          // public UserService(ICacheManager cacheManager)
          // {
          //     _cacheManager = cacheManager;
          // }
      }
      

      UserInjectAttribute 用戶管理器注入

      使用[UserInject]特性可以注入用戶管理器實(shí)例:

      [UserInject]
      public partial class UserService
      {
          // 生成的代碼將包含:
          // private readonly IUserManager _userManager;
          // 
          // public UserService(IUserManager userManager)
          // {
          //     _userManager = userManager;
          // }
      }
      

      OptionsInjectAttribute 配置項(xiàng)注入

      使用[OptionsInject]特性可以根據(jù)指定的配置項(xiàng)類型注入配置實(shí)例:

      [OptionsInject(OptionType = "TenantOptions")]
      public partial class UserService
      {
          // 生成的代碼將包含:
          // private readonly TenantOptions _tenantOptions;
          // 
          // public UserService(IOptions<TenantOptions> tenantOptions)
          // {
          //     _tenantOptions = tenantOptions.Value;
          // }
      }
      

      CustomInjectAttribute 自定義注入

      使用[CustomInject]特性可以注入任意類型的依賴項(xiàng):

      [CustomInject(VarType = "IRepository<SysUser>", VarName = "_userRepository")]
      [CustomInject(VarType = "INotificationService", VarName = "_notificationService")]
      public partial class UserService
      {
          // 生成的代碼將包含:
          // private readonly IRepository<SysUser> _userRepository;
          // private readonly INotificationService _notificationService;
          // 
          // public UserService(IRepository<SysUser> userRepository, INotificationService notificationService)
          // {
          //     _userRepository = userRepository;
          //     _notificationService = notificationService;
          // }
      }
      

      組合注入示例

      多種注入特性可以組合使用,生成器會(huì)自動(dòng)合并所有注入需求:

      [ConstructorInject]
      [LoggerInject]
      [CacheInject]
      [UserInject]
      [OptionsInject(OptionType = "TenantOptions")]
      [CustomInject(VarType = "IRepository<SysUser>", VarName = "_userRepository")]
      public partial class UserService
      {
          private readonly IRoleRepository _roleRepository;
          private readonly IPermissionRepository _permissionRepository;
          
          // 生成的代碼將包含所有注入項(xiàng):
          // private readonly ILogger<UserService> _logger;
          // private readonly ICacheManager _cacheManager;
          // private readonly IUserManager _userManager;
          // private readonly TenantOptions _tenantOptions;
          // private readonly IRepository<SysUser> _userRepository;
          // private readonly IRoleRepository _roleRepository;
          // private readonly IPermissionRepository _permissionRepository;
          //
          // public UserService(
          //     ILoggerFactory loggerFactory,
          //     ICacheManager cacheManager,
          //     IUserManager userManager,
          //     IOptions<TenantOptions> tenantOptions,
          //     IRepository<SysUser> userRepository,
          //     IRoleRepository roleRepository,
          //     IPermissionRepository permissionRepository)
          // {
          //     _logger = loggerFactory.CreateLogger<UserService>();
          //     _cacheManager = cacheManager;
          //     _userManager = userManager;
          //     _tenantOptions = tenantOptions.Value;
          //     _userRepository = userRepository;
          //     _roleRepository = roleRepository;
          //     _permissionRepository = permissionRepository;
          // }
      }
      

      2. Builder模式代碼生成

      Builder模式是一種創(chuàng)建型設(shè)計(jì)模式,能夠分步驟創(chuàng)建復(fù)雜對(duì)象。使用Builder模式可以創(chuàng)建不同表現(xiàn)的對(duì)象,同時(shí)避免構(gòu)造函數(shù)參數(shù)過(guò)多的問(wèn)題。

      Mud.EntityCodeGenerator支持通過(guò)[Builder]特性自動(dòng)生成Builder構(gòu)建器模式代碼:

      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [DtoGenerator]
      [Builder]
      [Table(Name = "sys_client"),SuppressSniffer]
      public partial class SysClientEntity
      {
          /// <summary>
          /// id
          /// </summary>
          [property: Column(Name = "id", IsPrimary = true, Position = 1)]
          [property: Required(ErrorMessage = "id不能為空")]
          private long? _id;
      
          /// <summary>
          /// 客戶端key
          /// </summary>
          [property: Column(Name = "client_key", Position = 3)]
          [property: Required(ErrorMessage = "客戶端key不能為空")]
          private string _clientKey;
      
          /// <summary>
          /// 刪除標(biāo)志(0代表存在 2代表刪除)
          /// </summary>
          [property: Column(Name = "del_flag", Position = 10)]
          private string _delFlag;
      }
      

      基于以上實(shí)體,將自動(dòng)生成Builder構(gòu)建器類:

      /// <summary>
      /// <see cref="SysClientEntity"/> 的構(gòu)建者。
      /// </summary>
      public class SysClientEntityBuilder
      {
          private SysClientEntity _sysClientEntity = new SysClientEntity();
      
          /// <summary>
          /// 設(shè)置 <see cref="SysClientEntity.Id"/> 屬性值。
          /// </summary>
          /// <param name="id">屬性值</param>
          /// <returns>返回 <see cref="SysClientEntityBuilder"/> 實(shí)例</returns>
          public SysClientEntityBuilder SetId(long? id)
          {
              this._sysClientEntity.Id = id;
              return this;
          }
      
          /// <summary>
          /// 設(shè)置 <see cref="SysClientEntity.ClientKey"/> 屬性值。
          /// </summary>
          /// <param name="clientKey">屬性值</param>
          /// <returns>返回 <see cref="SysClientEntityBuilder"/> 實(shí)例</returns>
          public SysClientEntityBuilder SetClientKey(string clientKey)
          {
              this._sysClientEntity.ClientKey = clientKey;
              return this;
          }
      
          /// <summary>
          /// 設(shè)置 <see cref="SysClientEntity.DelFlag"/> 屬性值。
          /// </summary>
          /// <param name="delFlag">屬性值</param>
          /// <returns>返回 <see cref="SysClientEntityBuilder"/> 實(shí)例</returns>
          public SysClientEntityBuilder SetDelFlag(string delFlag)
          {
              this._sysClientEntity.DelFlag = delFlag;
              return this;
          }
      
          /// <summary>
          /// 構(gòu)建 <see cref="SysClientEntity"/> 類的實(shí)例。
          /// </summary>
          public SysClientEntity Build()
          {
              return this._sysClientEntity;
          }
      }
      

      使用Builder模式可以鏈?zhǔn)皆O(shè)置實(shí)體屬性,創(chuàng)建實(shí)體對(duì)象更加方便:

      var client = new SysClientEntityBuilder()
          .SetClientKey("client123")
          .SetDelFlag("0")
          .Build();
      

      3. DTO/VO代碼生成

      在現(xiàn)代Web應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)傳輸對(duì)象(DTO)和視圖對(duì)象(VO)是常見(jiàn)的設(shè)計(jì)模式。它們用于在不同層之間傳輸數(shù)據(jù),避免直接暴露實(shí)體類。

      Mud.EntityCodeGenerator可以自動(dòng)生成DTO和VO類:

      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [DtoGenerator]
      [Table(Name = "sys_client"),SuppressSniffer]
      public partial class SysClientEntity
      {
          /// <summary>
          /// id
          /// </summary>
          [property: TableField(Fille = FieldFill.Insert, Value = FillValue.Id)]
          [property: Column(Name = "id", IsPrimary = true, Position = 1)]
          [property: Required(ErrorMessage = "id不能為空")]
          private long? _id;
      
          /// <summary>
          /// 客戶端key
          /// </summary>
          [property: Column(Name = "client_key", Position = 3)]
          [property: Required(ErrorMessage = "客戶端key不能為空")]
          [property: ExportProperty("客戶端key")]
          [property: CustomVo1, CustomVo2]
          [property: CustomBo1, CustomBo2]
          private string _clientKey;
      
          /// <summary>
          /// 刪除標(biāo)志(0代表存在 2代表刪除)
          /// </summary>
          [property: Column(Name = "del_flag", Position = 10)]
          [property: ExportProperty("刪除標(biāo)志")]
          [IgnoreQuery]
          private string _delFlag;
      }
      

      基于以上實(shí)體,將自動(dòng)生成以下幾類代碼:

      VO類 (視圖對(duì)象)

      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [SuppressSniffer, CompilerGenerated]
      public partial class SysClientListOutput
      {
          /// <summary>
          /// id
          /// </summary>
          public long? id { get; set; }
      
          /// <summary>
          /// 客戶端key
          /// </summary>
          [ExportProperty("客戶端key")]
          [CustomVo1, CustomVo2]
          public string? clientKey { get; set; }
      
          /// <summary>
          /// 刪除標(biāo)志(0代表存在 2代表刪除)
          /// </summary>
          [ExportProperty("刪除標(biāo)志")]
          public string? delFlag { get; set; }
      }
      

      QueryInput類 (查詢輸入對(duì)象)

      // SysClientQueryInput.g.cs
      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [SuppressSniffer, CompilerGenerated]
      public partial class SysClientQueryInput : DataQueryInput
      {
          /// <summary>
          /// id
          /// </summary>
          public long? id { get; set; }
          /// <summary>
          /// 客戶端key
          /// </summary>
          public string? clientKey { get; set; }
          /// <summary>
          /// 刪除標(biāo)志(0代表存在 2代表刪除)
          /// </summary>
          public string? delFlag { get; set; }
      
          /// <summary>
          /// 構(gòu)建通用的查詢條件。
          /// </summary>
          public Expression<Func<SysClientEntity, bool>> BuildQueryWhere()
          {
              var where = LinqExtensions.True<SysClientEntity>();
              where = where.AndIF(this.id != null, x => x.Id == this.id);
              where = where.AndIF(!string.IsNullOrEmpty(this.clientKey), x => x.ClientKey == this.clientKey);
              where = where.AndIF(!string.IsNullOrEmpty(this.delFlag), x => x.DelFlag == this.delFlag);
              return where;
          }
      }
      

      CrInput類 (創(chuàng)建輸入對(duì)象)

      // SysClientCrInput.g.cs
      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [SuppressSniffer, CompilerGenerated]
      public partial class SysClientCrInput
      {
          /// <summary>
          /// 客戶端key
          /// </summary>
          [Required(ErrorMessage = "客戶端key不能為空"), CustomBo1, CustomBo2]
          public string? clientKey { get; set; }
          /// <summary>
          /// 刪除標(biāo)志(0代表存在 2代表刪除)
          /// </summary>
          public string? delFlag { get; set; }
      
          /// <summary>
          /// 通用的BO對(duì)象映射至實(shí)體方法。
          /// </summary>
          public virtual SysClientEntity MapTo()
          {
              var entity = new SysClientEntity();
              entity.ClientKey = this.clientKey;
              entity.DelFlag = this.delFlag;
              return entity;
          }
      }
      

      UpInput類 (更新輸入對(duì)象)

      /// <summary>
      /// 客戶端信息實(shí)體類
      /// </summary>
      [SuppressSniffer, CompilerGenerated]
      public partial class SysClientUpInput : SysClientCrInput
      {
          /// <summary>
          /// id
          /// </summary>
          [Required(ErrorMessage = "id不能為空")]
          public long? id { get; set; }
      
          /// <summary>
          /// 通用的BO對(duì)象映射至實(shí)體方法。
          /// </summary>
          public override SysClientEntity MapTo()
          {
              var entity = base.MapTo();
              entity.Id = this.id;
              return entity;
          }
      }
      

      4. 實(shí)體映射方法生成

      在不同對(duì)象之間進(jìn)行屬性映射是一項(xiàng)常見(jiàn)但繁瑣的工作。Mud.EntityCodeGenerator可以自動(dòng)生成實(shí)體與DTO之間的映射方法:

      /// <summary>
      /// 通用的實(shí)體映射至VO對(duì)象方法。
      /// </summary>
      public virtual SysClientListOutput MapTo()
      {
          var voObj = new SysClientListOutput();
          voObj.id = this.Id;
          voObj.clientKey = this.ClientKey;
          voObj.delFlag = this.DelFlag;
          return voObj;
      }
      

      配置和使用

      項(xiàng)目配置

      在使用Mud代碼生成器時(shí),可以通過(guò)在項(xiàng)目文件中配置參數(shù)來(lái)自定義生成行為。

      實(shí)體代碼生成器配置參數(shù)

      <PropertyGroup>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>  <!-- 在obj目錄下保存生成的代碼 -->
        <EntitySuffix>Entity</EntitySuffix>  <!-- 實(shí)體類后綴配置 -->
        <EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>  <!-- 生成的VO、BO類加上Attribute特性配置,多個(gè)特性時(shí)使用','分隔 -->
        
        <!-- 屬性名配置 -->
        <PropertyNameLowerCaseFirstLetter>true</PropertyNameLowerCaseFirstLetter>  <!-- 是否將生成的屬性名首字母小寫,默認(rèn)為true -->
        
        <!-- VO/BO 屬性配置參數(shù) -->
        <VoAttributes>CustomVo1Attribute,CustomVo2Attribute</VoAttributes>  <!-- 需要添加至VO類的自定義特性,多個(gè)特性時(shí)使用','分隔 -->
        <BoAttributes>CustomBo1Attribute,CustomBo2Attribute</BoAttributes>  <!-- 需要添加至BO類的自定義特性,多個(gè)特性時(shí)使用','分隔 -->
      </PropertyGroup>
      
      <ItemGroup>
        <CompilerVisibleProperty Include="EntitySuffix" />
        <CompilerVisibleProperty Include="EntityAttachAttributes" />
        <CompilerVisibleProperty Include="PropertyNameLowerCaseFirstLetter" />
        <CompilerVisibleProperty Include="VoAttributes" />
        <CompilerVisibleProperty Include="BoAttributes" />
      </ItemGroup>
      

      服務(wù)代碼生成器配置參數(shù)

      <PropertyGroup>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>  <!-- 在obj目錄下保存生成的代碼 -->
        
        <!-- 依賴注入相關(guān)配置 -->
        <DefaultCacheManagerType>ICacheManager</DefaultCacheManagerType>  <!-- 緩存管理器類型默認(rèn)值 -->
        <DefaultUserManagerType>IUserManager</DefaultUserManagerType>  <!-- 用戶管理器類型默認(rèn)值 -->
        <DefaultLoggerVariable>_logger</DefaultLoggerVariable>  <!-- 日志變量名默認(rèn)值 -->
        <DefaultCacheManagerVariable>_cacheManager</DefaultCacheManagerVariable>  <!-- 緩存管理器變量名默認(rèn)值 -->
        <DefaultUserManagerVariable>_userManager</DefaultUserManagerVariable>  <!-- 用戶管理器變量名默認(rèn)值 -->
        
        <!-- 服務(wù)生成相關(guān)配置 -->
        <ServiceGenerator>true</ServiceGenerator>  <!-- 是否生成服務(wù)端代碼 -->
        <EntitySuffix>Entity</EntitySuffix>  <!-- 實(shí)體類后綴配置 -->
        <ImpAssembly>Mud.System</ImpAssembly>  <!-- 需要生成代碼的接口實(shí)現(xiàn)程序集 -->
        
        <!-- DTO生成相關(guān)配置 -->
        <EntityAttachAttributes>SuppressSniffer</EntityAttachAttributes>  <!-- 實(shí)體類加上Attribute特性配置,多個(gè)特性時(shí)使用','分隔 -->
      </PropertyGroup>
      
      <ItemGroup>
        <CompilerVisibleProperty Include="DefaultCacheManagerType" />
        <CompilerVisibleProperty Include="DefaultUserManagerType" />
        <CompilerVisibleProperty Include="DefaultLoggerVariable" />
        <CompilerVisibleProperty Include="DefaultCacheManagerVariable" />
        <CompilerVisibleProperty Include="DefaultUserManagerVariable" />
        <CompilerVisibleProperty Include="ServiceGenerator" />
        <CompilerVisibleProperty Include="EntitySuffix" />
        <CompilerVisibleProperty Include="ImpAssembly" />
        <CompilerVisibleProperty Include="EntityAttachAttributes" />
      </ItemGroup>
      

      依賴項(xiàng)配置

      <ItemGroup>
        <!-- 引入的代碼生成器程序集 -->
        <PackageReference Include="Mud.EntityCodeGenerator" Version="1.1.8" />
        <PackageReference Include="Mud.ServiceCodeGenerator" Version="1.1.8" />
      </ItemGroup>
      

      高級(jí)特性

      忽略字段注入

      對(duì)于某些不需要通過(guò)構(gòu)造函數(shù)注入的字段,可以使用[IgnoreGenerator]特性標(biāo)記:

      [ConstructorInject]
      public partial class UserService
      {
          private readonly IUserRepository _userRepository;
          
          [IgnoreGenerator]
          private readonly string _connectionString = "default_connection_string"; // 不會(huì)被注入
          
          // 只有_userRepository會(huì)被構(gòu)造函數(shù)注入
      }
      

      自定義屬性生成

      Mud代碼生成器支持通過(guò)配置參數(shù)為生成的類添加自定義特性:

      <PropertyGroup>
        <!-- 需要添加至VO類的自定義特性,多個(gè)特性時(shí)使用','分隔 -->
        <VoAttributes>CustomVo1Attribute,CustomVo2Attribute</VoAttributes>
        <!-- 需要添加至BO類的自定義特性,多個(gè)特性時(shí)使用','分隔 -->
        <BoAttributes>CustomBo1Attribute,CustomBo2Attribute</BoAttributes>
      </PropertyGroup>
      

      與其他工具的比較

      與AutoMapper的比較

      AutoMapper是一個(gè)流行的對(duì)象映射工具,但它運(yùn)行時(shí)進(jìn)行映射,而Mud代碼生成器在編譯時(shí)生成映射代碼。這意味著:

      1. 性能:Mud生成的代碼在運(yùn)行時(shí)性能更好,因?yàn)闆](méi)有反射開(kāi)銷
      2. 類型安全:編譯時(shí)生成的代碼具有更好的類型安全性
      3. 調(diào)試友好:生成的代碼可以直接調(diào)試,更容易排查問(wèn)題

      與傳統(tǒng)手工編碼的比較

      1. 開(kāi)發(fā)效率:大大減少了樣板代碼的編寫時(shí)間
      2. 維護(hù)性:當(dāng)實(shí)體類發(fā)生變化時(shí),相關(guān)代碼會(huì)自動(dòng)更新
      3. 一致性:生成的代碼風(fēng)格統(tǒng)一,減少了人為錯(cuò)誤

      最佳實(shí)踐

      1. 合理使用特性標(biāo)記

      不要為所有類都添加代碼生成特性,只在確實(shí)需要的類上使用。過(guò)度使用可能導(dǎo)致生成大量不必要的代碼。

      2. 配置參數(shù)優(yōu)化

      根據(jù)項(xiàng)目實(shí)際情況配置生成參數(shù),例如:

      <PropertyGroup>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
        <EntitySuffix>Entity</EntitySuffix>
        <PropertyNameLowerCaseFirstLetter>false</PropertyNameLowerCaseFirstLetter>
      </PropertyGroup>
      

      3. 查看生成代碼

      在開(kāi)發(fā)階段,建議啟用[EmitCompilerGeneratedFiles]參數(shù),以便查看生成的代碼:

      <PropertyGroup>
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
      </PropertyGroup>
      

      生成的代碼將位于obj/[Configuration]/[TargetFramework]/generated/目錄下,文件名以.g.cs結(jié)尾。

      4. 版本管理

      生成的代碼不需要加入版本管理,因?yàn)樗鼈儠?huì)在編譯時(shí)自動(dòng)生成。可以在.gitignore中添加:

      **/*.g.cs
      

      實(shí)際應(yīng)用案例

      案例1:用戶服務(wù)類

      [ConstructorInject]
      [LoggerInject]
      [CacheInject]
      [UserInject]
      public partial class UserService
      {
          private readonly IUserRepository _userRepository;
          private readonly IRoleRepository _roleRepository;
          
          public async Task<UserDto> GetUserAsync(long userId)
          {
              _logger.LogInformation("Getting user with id: {UserId}", userId);
              
              var user = await _userRepository.GetByIdAsync(userId);
              if (user == null)
              {
                  _logger.LogWarning("User with id {UserId} not found", userId);
                  return null;
              }
              
              var userDto = user.MapTo();
              return userDto;
          }
      }
      

      案例2:訂單實(shí)體類

      [DtoGenerator]
      [Builder]
      public partial class OrderEntity
      {
          [property: Column(Name = "id", IsPrimary = true)]
          [property: Required]
          private long? _id;
          
          [property: Column(Name = "order_no")]
          [property: Required]
          private string _orderNo;
          
          [property: Column(Name = "amount")]
          [property: Required]
          private decimal? _amount;
          
          [property: Column(Name = "status")]
          private string _status;
      }
      

      性能和安全性考慮

      性能優(yōu)勢(shì)

      1. 編譯時(shí)生成:所有代碼在編譯時(shí)生成,運(yùn)行時(shí)無(wú)額外開(kāi)銷
      2. 無(wú)反射調(diào)用:生成的代碼直接調(diào)用,避免反射帶來(lái)的性能損耗
      3. 類型安全:編譯時(shí)檢查確保類型安全,減少運(yùn)行時(shí)錯(cuò)誤

      安全性考慮

      1. 代碼審查:雖然代碼是自動(dòng)生成的,但仍需要審查生成的代碼以確保符合安全要求
      2. 依賴注入:通過(guò)構(gòu)造函數(shù)注入確保依賴關(guān)系明確,便于測(cè)試和維護(hù)
      3. 訪問(wèn)控制:生成的屬性和方法遵循.NET的訪問(wèn)控制原則

      擴(kuò)展和定制

      Mud代碼生成器設(shè)計(jì)為可擴(kuò)展的,開(kāi)發(fā)者可以根據(jù)自己的需求定制代碼生成邏輯:

      1. 自定義特性:可以創(chuàng)建自己的特性來(lái)控制代碼生成行為
      2. 模板定制:可以修改代碼生成模板以適應(yīng)特定需求
      3. 插件機(jī)制:可以通過(guò)插件機(jī)制添加新的代碼生成功能

      總結(jié)

      通過(guò)Mud代碼生成器,我們可以在.NET平臺(tái)上實(shí)現(xiàn)類似Java Lombok的功能,甚至更加豐富和強(qiáng)大。這套工具通過(guò)Roslyn源代碼生成技術(shù),在編譯時(shí)自動(dòng)生成我們需要的樣板代碼,大大提高了開(kāi)發(fā)效率,減少了手動(dòng)編寫代碼的工作量。

      主要優(yōu)勢(shì)包括:

      1. 提高開(kāi)發(fā)效率:自動(dòng)生成構(gòu)造函數(shù)注入、Builder模式、DTO等代碼
      2. 保證代碼質(zhì)量:生成的代碼遵循統(tǒng)一規(guī)范,減少人為錯(cuò)誤
      3. 提升性能:編譯時(shí)生成,運(yùn)行時(shí)無(wú)額外開(kāi)銷
      4. 易于維護(hù):當(dāng)源代碼變化時(shí),相關(guān)代碼自動(dòng)更新

      通過(guò)合理使用這套工具,我們可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而將重復(fù)性的樣板代碼交給代碼生成器處理,真正實(shí)現(xiàn)高效、高質(zhì)量的軟件開(kāi)發(fā)。

      無(wú)論你是正在開(kāi)發(fā)新的.NET項(xiàng)目,還是想要重構(gòu)現(xiàn)有項(xiàng)目以減少樣板代碼,Mud代碼生成器都是一個(gè)值得考慮的強(qiáng)大工具。它不僅能夠顯著提高開(kāi)發(fā)效率,還能幫助團(tuán)隊(duì)保持代碼的一致性和可維護(hù)性。

      開(kāi)始使用Mud代碼生成器,讓你的.NET開(kāi)發(fā)體驗(yàn)更加接近Java Lombok帶來(lái)的便利,甚至更進(jìn)一步!

      posted @ 2025-10-10 09:21  玩泥巴的|mudtools.cn  閱讀(1553)  評(píng)論(15)    收藏  舉報(bào)
      主站蜘蛛池模板: 神马久久亚洲一区 二区| 高清破外女出血AV毛片| 亚洲精品日韩在线观看| 精品少妇av蜜臀av| 人妻精品动漫H无码中字| 亚洲最大的成人网站| 亚洲精品tv久久久久久久| 免费国产精品视频在线| 人妻有码av中文字幕久久琪| 亚洲欧美在线观看品| 国产又大又黑又粗免费视频| 蜜桃av无码免费看永久| 国产精品自产拍在线播放| 亚洲av免费看一区二区| 日本高清视频网站www| av午夜福利亚洲精品福利| 久久精品国产99国产精品澳门 | 成年女人黄小视频| 国产精品中文字幕第一区| 一卡2卡三卡4卡免费网站| 获嘉县| 夜色福利站WWW国产在线视频| 亚洲乱码中文字幕小综合| 元氏县| 国产精品人成视频免费国产| 精品熟女亚洲av在线观看| 国产精品一区二区性色av| 茄子视频国产在线观看| 99久久精品国产一区二区 | 亚洲一区二区av免费| 濉溪县| 亚洲欧美综合精品成人网站| 各种少妇wbb撒尿| 国产午夜亚洲精品不卡网站| 久女女热精品视频在线观看| 久久青青草原精品国产app| 一区二区三区午夜无码视频| 国产精品美女黑丝流水| 国产精品99区一区二区三| 日本高清在线播放一区二区三区| 国产极品粉嫩尤物一线天|