استفاده از تولید کننده کد منبع C# برای خودکارسازی وظایف توسعه

Summarize this content to 400 words in Persian Lang
Source Generators یک ویژگی قدرتمند معرفی شده در C# 9 و .NET 5 است که به شما امکان می دهد کد کاربر را بررسی کنید و فایل های کد C# جدید را در طول کامپایل تولید کنید. آنها به ویژه برای خودکارسازی وظایف تکراری و بهبود کارایی توسعه مفید هستند. در این مقاله، نحوه ایجاد یک Source Generator را بررسی خواهیم کرد که به طور خودکار شمارشگرها (enums) را تولید کرده و آن را در یک پروژه کنسول دات نت ادغام کند.
منبع مولد چیست؟
Source Generator اجزایی هستند که به شما امکان می دهند در مرحله کامپایل کد را به پروژه خود اضافه کنید. آنها توسط کامپایلر اجرا می شوند و می توانند فایل های کد سی شارپ جدید را بر اساس تجزیه و تحلیل کدهای موجود ایجاد کنند. این می تواند شامل تولید کد دیگ بخار، اعتبارسنجی خودکار و موارد دیگر باشد. مزیت اصلی Source Generators این است که به کاهش مقدار کدهای تکراری که توسعه دهندگان نیاز به نوشتن و نگهداری دارند کمک می کند.
مزایای مولدهای منبع
Boilerplate Code Automation: مولدهای منبع می توانند به طور خودکار کدهای تکراری لازم مانند ویژگی ها، روش ها یا حتی کل کلاس ها را بر اساس الگوهای تعریف شده ایجاد کنند. زمان کمتر برای نوشتن کدهای تکراری، زمان بیشتری برای نوشیدن آن قهوه خاص.
بهبود عملکرد: از آنجایی که کد در زمان کامپایل تولید می شود، در زمان اجرا هیچ سرباری وجود ندارد که می تواند منجر به بهبود عملکرد شود. حتی ممکن است کد شما برنده جایزه بهره وری شود.
تعمیر و نگهداری آسان تر: کاهش کد دستی احتمال خطا را کاهش می دهد و نگهداری کد را آسان تر می کند. اشکالات کمتر، لبخندهای بیشتر.
انعطافپذیری: آنها به شما اجازه میدهند استانداردها و شیوههای ثابتی را در کل پایگاه کد تعریف کنید و از معماری تمیزتر و کارآمدتر اطمینان حاصل کنید. چه کسی یک پایگاه کد به خوبی سازماندهی شده را دوست ندارد؟
مثال عملی: Enum Generator
در این مثال دو پروژه ایجاد خواهیم کرد:
EnumGenerator – پروژه تولید کننده کد که enum ها را ایجاد می کند.
EnumGeneratorDemoApp – پروژه اصلی که enum های تولید شده را مصرف می کند.
ساختار پروژهساختار دایرکتوری به صورت زیر خواهد بود:
EnumGeneratorDemo/├── EnumGenerator/│ ├── EnumGenerator.csproj│ ├── EnumGenerator.cs│ └── obj/├── EnumGeneratorDemoApp/│ ├── EnumGeneratorDemoApp.csproj│ ├── Program.cs│ └── obj/└── EnumGeneratorDemo.sln
ایجاد و پیکربندی گام به گام
1. ایجاد ساختار دایرکتوری
یک دایرکتوری برای پروژه ایجاد کنید:
mkdir EnumGeneratorDemo
cd EnumGeneratorDemo
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ایجاد دایرکتوری برای تولید کننده کد و برنامه:
mkdir EnumGenerator
mkdir EnumGeneratorDemoApp
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
2. ایجاد پروژه EnumGenerator
به دایرکتوری EnumGenerator بروید و یک پروژه کتابخانه کلاس ایجاد کنید:
cd EnumGeneratordotnet new classlib -n EnumGenerator
وابستگی های مورد نیاز را در قسمت اضافه کنید EnumGenerator.csproj فایل:
Sdk=”Microsoft.NET.Sdk”>
net8.0
enable
enable
true
Include=”Microsoft.CodeAnalysis.Analyzers” Version=”3.3.4″>
runtime; build; native; contentfiles; analyzers; buildtransitive
all
Include=”Microsoft.CodeAnalysis.CSharp” Version=”4.10.0″ />
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ایجاد کنید EnumGenerator.cs فایل با محتوای زیر:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System.Linq;
using System.Text;
namespace EnumGenerator
{
[Generator]
public class EnumGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
System.Diagnostics.Debug.WriteLine(“EnumGenerator initialized”);
}
public void Execute(GeneratorExecutionContext context)
{
System.Diagnostics.Debug.WriteLine(“EnumGenerator is running!”);
var enums = new[]
{
new { Name = “OrderStatus”, Values = new[] { “Pending”, “Processing”, “Shipped”, “Delivered”, “Cancelled” } },
new { Name = “UserRole”, Values = new[] { “Admin”, “User”, “Guest” } }
};
foreach (var enumDef in enums)
{
var source = GenerateEnumSource(enumDef.Name, enumDef.Values);
context.AddSource($”{enumDef.Name}.g.cs”, SourceText.From(source, Encoding.UTF8));
System.Diagnostics.Debug.WriteLine($”Generated {enumDef.Name}.g.cs”);
}
}
private string GenerateEnumSource(string enumName, string[] values)
{
var enumValues = string.Join(“,\n “, values);
return $@”
namespace EnumGeneratorDemoApp.Enums
{{
public enum {enumName}
{{
{enumValues}
}}
}}
“;
}
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
3. ایجاد پروژه EnumGeneratorDemoApp
به دایرکتوری EnumGeneratorDemoApp بروید و یک پروژه برنامه کاربردی کنسول ایجاد کنید:
cd ../EnumGeneratorDemoApp
dotnet new console -n EnumGeneratorDemoApp
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مرجع را به EnumGenerator پروژه در EnumGeneratorDemoApp.csproj فایل:
Sdk=”Microsoft.NET.Sdk”>
Exe
net8.0
enable
enable
Include=”..\EnumGenerator\EnumGenerator.csproj” OutputItemType=”Analyzer” ReferenceOutputAssembly=”false” />
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ایجاد کنید Program.cs فایل با محتوای زیر:
using EnumGeneratorDemoApp.Enums;
using System;
namespace EnumGeneratorDemoApp
{
class Program
{
static void Main(string[] args)
{
var order = new Order
{
Id = Guid.NewGuid(),
Status = OrderStatus.Pending
};
var user = new User
{
Id = Guid.NewGuid(),
Role = UserRole.Admin
};
Console.WriteLine($”Order ID: {order.Id}, Status: {order.Status}”);
Console.WriteLine($”User ID: {user.Id}, Role: {user.Role}”);
}
}
public class Order
{
public Guid Id { get; set; }
public OrderStatus Status { get; set; }
}
public class User
{
public Guid Id { get; set; }
public UserRole Role { get; set; }
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
4. ایجاد راه حل و اضافه کردن پروژه ها
به دایرکتوری EnumGeneratorDemo برگردید و یک راه حل ایجاد کنید:
cd ..
dotnet new sln -n EnumGeneratorDemo
dotnet sln add EnumGenerator/EnumGenerator.csproj
dotnet sln add EnumGeneratorDemoApp/EnumGeneratorDemoApp.csproj
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
5. تدوین و اجرا
ابتدا پروژه EnumGenerator را کامپایل کنید:
cd EnumGenerator
dotnet build
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
پروژه اصلی EnumGeneratorDemoApp را بسازید:
cd ../EnumGeneratorDemoApp
dotnet build
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اجرای پروژه اصلی:
dotnet run
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
6. تایید فایل های تولید شده
به صورت دستی بررسی کنید که آیا فایلهای .g.cs در پوشه obj ایجاد شدهاند EnumGeneratorDemoApp پروژه:
cd EnumGeneratorDemoApp/obj/Debug/net8.0/generated/EnumGeneratorDemoApp/
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
نتیجه
در این مقاله به بررسی این موضوع می پردازیم که چگونه Source Generators می تواند شیوه نوشتن و نگهداری کد در سی شارپ را متحول کند. با مثال عملی خود، نحوه ایجاد و پیکربندی یک مولد enum را دیدیم که ایجاد شمارشگرها را در حین کامپایل خودکار می کند و نیاز به نوشتن کدهای تکراری به صورت دستی را کاهش می دهد.
ژنراتورهای منبع مجموعه ای از مزایا را ارائه می دهند، از بهبود عملکرد گرفته تا سهولت نگهداری و استانداردسازی کد. با خودکار کردن کارهای تکراری و خسته کننده، زمان بیشتری را برای تمرکز بر بخش های واقعا مهم و خلاقانه توسعه نرم افزار آزاد می کنید.
علاوه بر این، انعطافپذیری Source Generators به شما اجازه میدهد تا استانداردها و شیوههای ثابتی را در کل پایگاه کد خود پیادهسازی کنید و معماری تمیزتر و کارآمدتر را ارتقا دهید. دنیایی را تصور کنید که در آن نیازی نیست نگران تولید کد دیگ بخار باشید و بتوانید روی توسعه راه حل های نوآورانه و قوی تمرکز کنید.
برای تکمیل کاوش خود در Source Generators، توصیه میکنم از مخزن amis92/csharp-source-generators دیدن کنید، که حاوی چندین نمونه و کتابخانه است که میتواند به توسعه کمک کند.
اگر هنوز Source Generators را امتحان نکرده اید، اکنون زمان آن فرا رسیده است. آنها نه تنها بهره وری شما را افزایش می دهند بلکه کیفیت کد شما را نیز بهبود می بخشند. و همانطور که دیدیم، راهاندازی و استفاده، بهویژه با قدرت ابزارها و کتابخانههای داتنت، ساده و ساده است.
برای بررسی کد نمونه کامل مورد بحث در این مقاله، از Alisson Podgurski GitHub من دیدن کنید. من مثال را بیشتر اضافه می کنم تا بتوانید خودتان آن را بررسی و آزمایش کنید.
بنابراین مولدهای منبع را کاوش کنید و ببینید که چگونه می توانند گردش کار شما را تغییر دهند. پایگاه کد و عقل شما از شما تشکر خواهد کرد!
Source Generators یک ویژگی قدرتمند معرفی شده در C# 9 و .NET 5 است که به شما امکان می دهد کد کاربر را بررسی کنید و فایل های کد C# جدید را در طول کامپایل تولید کنید. آنها به ویژه برای خودکارسازی وظایف تکراری و بهبود کارایی توسعه مفید هستند. در این مقاله، نحوه ایجاد یک Source Generator را بررسی خواهیم کرد که به طور خودکار شمارشگرها (enums) را تولید کرده و آن را در یک پروژه کنسول دات نت ادغام کند.
منبع مولد چیست؟
Source Generator اجزایی هستند که به شما امکان می دهند در مرحله کامپایل کد را به پروژه خود اضافه کنید. آنها توسط کامپایلر اجرا می شوند و می توانند فایل های کد سی شارپ جدید را بر اساس تجزیه و تحلیل کدهای موجود ایجاد کنند. این می تواند شامل تولید کد دیگ بخار، اعتبارسنجی خودکار و موارد دیگر باشد. مزیت اصلی Source Generators این است که به کاهش مقدار کدهای تکراری که توسعه دهندگان نیاز به نوشتن و نگهداری دارند کمک می کند.
مزایای مولدهای منبع
-
Boilerplate Code Automation: مولدهای منبع می توانند به طور خودکار کدهای تکراری لازم مانند ویژگی ها، روش ها یا حتی کل کلاس ها را بر اساس الگوهای تعریف شده ایجاد کنند. زمان کمتر برای نوشتن کدهای تکراری، زمان بیشتری برای نوشیدن آن قهوه خاص.
-
بهبود عملکرد: از آنجایی که کد در زمان کامپایل تولید می شود، در زمان اجرا هیچ سرباری وجود ندارد که می تواند منجر به بهبود عملکرد شود. حتی ممکن است کد شما برنده جایزه بهره وری شود.
-
تعمیر و نگهداری آسان تر: کاهش کد دستی احتمال خطا را کاهش می دهد و نگهداری کد را آسان تر می کند. اشکالات کمتر، لبخندهای بیشتر.
-
انعطافپذیری: آنها به شما اجازه میدهند استانداردها و شیوههای ثابتی را در کل پایگاه کد تعریف کنید و از معماری تمیزتر و کارآمدتر اطمینان حاصل کنید. چه کسی یک پایگاه کد به خوبی سازماندهی شده را دوست ندارد؟
مثال عملی: Enum Generator
در این مثال دو پروژه ایجاد خواهیم کرد:
- EnumGenerator – پروژه تولید کننده کد که enum ها را ایجاد می کند.
- EnumGeneratorDemoApp – پروژه اصلی که enum های تولید شده را مصرف می کند.
ساختار پروژه
ساختار دایرکتوری به صورت زیر خواهد بود:
EnumGeneratorDemo/
├── EnumGenerator/
│ ├── EnumGenerator.csproj
│ ├── EnumGenerator.cs
│ └── obj/
├── EnumGeneratorDemoApp/
│ ├── EnumGeneratorDemoApp.csproj
│ ├── Program.cs
│ └── obj/
└── EnumGeneratorDemo.sln
ایجاد و پیکربندی گام به گام
1. ایجاد ساختار دایرکتوری
یک دایرکتوری برای پروژه ایجاد کنید:
mkdir EnumGeneratorDemo
cd EnumGeneratorDemo
ایجاد دایرکتوری برای تولید کننده کد و برنامه:
mkdir EnumGenerator
mkdir EnumGeneratorDemoApp
2. ایجاد پروژه EnumGenerator
به دایرکتوری EnumGenerator بروید و یک پروژه کتابخانه کلاس ایجاد کنید:
cd EnumGenerator
dotnet new classlib -n EnumGenerator
وابستگی های مورد نیاز را در قسمت اضافه کنید EnumGenerator.csproj فایل:
Sdk="Microsoft.NET.Sdk">
net8.0
enable
enable
true
Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
runtime; build; native; contentfiles; analyzers; buildtransitive
all
Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0" />
ایجاد کنید EnumGenerator.cs فایل با محتوای زیر:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System.Linq;
using System.Text;
namespace EnumGenerator
{
[Generator]
public class EnumGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
System.Diagnostics.Debug.WriteLine("EnumGenerator initialized");
}
public void Execute(GeneratorExecutionContext context)
{
System.Diagnostics.Debug.WriteLine("EnumGenerator is running!");
var enums = new[]
{
new { Name = "OrderStatus", Values = new[] { "Pending", "Processing", "Shipped", "Delivered", "Cancelled" } },
new { Name = "UserRole", Values = new[] { "Admin", "User", "Guest" } }
};
foreach (var enumDef in enums)
{
var source = GenerateEnumSource(enumDef.Name, enumDef.Values);
context.AddSource($"{enumDef.Name}.g.cs", SourceText.From(source, Encoding.UTF8));
System.Diagnostics.Debug.WriteLine($"Generated {enumDef.Name}.g.cs");
}
}
private string GenerateEnumSource(string enumName, string[] values)
{
var enumValues = string.Join(",\n ", values);
return $@"
namespace EnumGeneratorDemoApp.Enums
{{
public enum {enumName}
{{
{enumValues}
}}
}}
";
}
}
}
3. ایجاد پروژه EnumGeneratorDemoApp
به دایرکتوری EnumGeneratorDemoApp بروید و یک پروژه برنامه کاربردی کنسول ایجاد کنید:
cd ../EnumGeneratorDemoApp
dotnet new console -n EnumGeneratorDemoApp
مرجع را به EnumGenerator پروژه در EnumGeneratorDemoApp.csproj فایل:
Sdk="Microsoft.NET.Sdk">
Exe
net8.0
enable
enable
Include="..\EnumGenerator\EnumGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
ایجاد کنید Program.cs فایل با محتوای زیر:
using EnumGeneratorDemoApp.Enums;
using System;
namespace EnumGeneratorDemoApp
{
class Program
{
static void Main(string[] args)
{
var order = new Order
{
Id = Guid.NewGuid(),
Status = OrderStatus.Pending
};
var user = new User
{
Id = Guid.NewGuid(),
Role = UserRole.Admin
};
Console.WriteLine($"Order ID: {order.Id}, Status: {order.Status}");
Console.WriteLine($"User ID: {user.Id}, Role: {user.Role}");
}
}
public class Order
{
public Guid Id { get; set; }
public OrderStatus Status { get; set; }
}
public class User
{
public Guid Id { get; set; }
public UserRole Role { get; set; }
}
}
4. ایجاد راه حل و اضافه کردن پروژه ها
به دایرکتوری EnumGeneratorDemo برگردید و یک راه حل ایجاد کنید:
cd ..
dotnet new sln -n EnumGeneratorDemo
dotnet sln add EnumGenerator/EnumGenerator.csproj
dotnet sln add EnumGeneratorDemoApp/EnumGeneratorDemoApp.csproj
5. تدوین و اجرا
ابتدا پروژه EnumGenerator را کامپایل کنید:
cd EnumGenerator
dotnet build
پروژه اصلی EnumGeneratorDemoApp را بسازید:
cd ../EnumGeneratorDemoApp
dotnet build
اجرای پروژه اصلی:
dotnet run
6. تایید فایل های تولید شده
به صورت دستی بررسی کنید که آیا فایلهای .g.cs در پوشه obj ایجاد شدهاند EnumGeneratorDemoApp پروژه:
cd EnumGeneratorDemoApp/obj/Debug/net8.0/generated/EnumGeneratorDemoApp/
نتیجه
در این مقاله به بررسی این موضوع می پردازیم که چگونه Source Generators می تواند شیوه نوشتن و نگهداری کد در سی شارپ را متحول کند. با مثال عملی خود، نحوه ایجاد و پیکربندی یک مولد enum را دیدیم که ایجاد شمارشگرها را در حین کامپایل خودکار می کند و نیاز به نوشتن کدهای تکراری به صورت دستی را کاهش می دهد.
ژنراتورهای منبع مجموعه ای از مزایا را ارائه می دهند، از بهبود عملکرد گرفته تا سهولت نگهداری و استانداردسازی کد. با خودکار کردن کارهای تکراری و خسته کننده، زمان بیشتری را برای تمرکز بر بخش های واقعا مهم و خلاقانه توسعه نرم افزار آزاد می کنید.
علاوه بر این، انعطافپذیری Source Generators به شما اجازه میدهد تا استانداردها و شیوههای ثابتی را در کل پایگاه کد خود پیادهسازی کنید و معماری تمیزتر و کارآمدتر را ارتقا دهید. دنیایی را تصور کنید که در آن نیازی نیست نگران تولید کد دیگ بخار باشید و بتوانید روی توسعه راه حل های نوآورانه و قوی تمرکز کنید.
برای تکمیل کاوش خود در Source Generators، توصیه میکنم از مخزن amis92/csharp-source-generators دیدن کنید، که حاوی چندین نمونه و کتابخانه است که میتواند به توسعه کمک کند.
اگر هنوز Source Generators را امتحان نکرده اید، اکنون زمان آن فرا رسیده است. آنها نه تنها بهره وری شما را افزایش می دهند بلکه کیفیت کد شما را نیز بهبود می بخشند. و همانطور که دیدیم، راهاندازی و استفاده، بهویژه با قدرت ابزارها و کتابخانههای داتنت، ساده و ساده است.
برای بررسی کد نمونه کامل مورد بحث در این مقاله، از Alisson Podgurski GitHub من دیدن کنید. من مثال را بیشتر اضافه می کنم تا بتوانید خودتان آن را بررسی و آزمایش کنید.
بنابراین مولدهای منبع را کاوش کنید و ببینید که چگونه می توانند گردش کار شما را تغییر دهند. پایگاه کد و عقل شما از شما تشکر خواهد کرد!