در نگارشهای اخیر داتنت، NET CLI. به همراه تغییرات قابل توجهی بودهاست که در این مطلب و نظرات آن، موارد مهم این تغییرات را بررسی خواهیم کرد.
console logger بهبود یافتهی داتنت 8
یکی از تغییرات بسیار جالب توجه و مفید NET CLI. در داتنت 8، امکان دسترسی به خروجی لاگهای ساختار یافتهی اعمال خط فرمان آن است:
اگر پروژهی خود را با استفاده از دستور dotnet build، کامپایل میکنید، خروجی پیشفرض این دستور خط فرمان، کلی و بدون ارائهی جزئیات است؛ اما میتوان آنرا در داتنت 8، به شکل تصویر فوق، تغییر داد و به این مزایا رسید:
- امکان مشاهدهی زمان کامپایل هر قسمت به صورت جداگانه
- امکان مشاهدهی پویای درصد انجام عملیات
- امکان مشاهدهی جزئیات کامپایل هر target framework به صورت مجزا
- دسترسی به یک خروجی رنگی و زیباتر
این خروجی را که به صورت پیشفرض فعال نیست، میتوان به دو صورت:
الف) سراسری و با اجرای دستور PowerShell زیر:
[Environment]::SetEnvironmentVariable("MSBUILDTERMINALLOGGER", "auto", "User")
که متغیر محیطی MSBUILDTERMINALLOGGER را به auto تنظیم میکند،
ب) و یا با استفاده از سوئیچ tl-- به ازای هر دستور dotnet build، به صورت جداگانهای فعال کرد:
dotnet build --tl
یک نکته: این قابلیت جالب و مهم، در دات نت 9، به صورت پیشفرض فعال است و نیازی به تنظیم خاصی ندارد.
معرفی Roslyn Tools
نمونه سوالات مصاحبه استخدامی
برای نمونه در اینجا کل موضوع مرتبط با ELMAH، تنها در طی یک ایمیل نمایش داده میشود و هرچند 13 ایمیل، مرتبط با آن هستند، اما 13 ایمیل به صورت جداگانه نمایش داده شده را دریافت نمیکنیم. علت این موضوع به Header خاص این نوع ایمیلها بر میگردد:
From: Atif Aziz <notifications@github.com> Reply-To: elmah/Elmah <reply+000bb03ad52eb40a4ec2d49bf78c53c3eba42efc401701a592cf00000001143e18c892a169ce0ae0bf4c@reply.github.com> To: elmah/Elmah <Elmah@noreply.github.com> Message-ID: <elmah/Elmah/issues/407/260080923@github.com> In-Reply-To: <elmah/Elmah/issues/407@github.com> References: <elmah/Elmah/issues/407@github.com> Subject: Re: [elmah/Elmah] Will ELMAH be ported to ASP.NET Core? (#407)
Message-ID بیانگر شمارهی منحصربفرد ایمیل ارسالی است.
فیلدهای اختیاری In-Reply-To و References تنها زمانی ذکر میشوند که قصد ارسال پاسخی، به یک Message-ID خاص، وجود داشته باشد. بنابراین مقدار درج شدهی در آنها دقیقا باید معادل Message-ID ایی باشد که پیشتر ارسال شدهاست.
اگر تنها فیلد References ذکر شود، از آن جهت تشخیص گروه یا Thread ایمیلهای رسیده استفاده میشود.
اگر نیاز به ذکر بیش از یک Message-ID وجود داشته باشد، نحوهی درج آن به صورت ذیل است:
References: <11111@yoursite.com> <22222@yoursite.com> <33333@yoursite.com>
نحوهی پیاده سازی این قابلیت توسط SmtpClient دات نت
در کدهای ذیل نحوهی افزودن هدرهای یاد شده را توسط SmtpClient دات نت مشاهده میکنید:
var smtpClient = new SmtpClient("….",587); using (MailMessage message = new MailMessage("USERNAME@gmail.com","USERNAME@gmail.com")) { message.Subject = "test"; message.Headers.Add("Message-ID", "<MESSAGEID@site.com>"); smtpClient.Send(message); } using (MailMessage message = new MailMessage("USERNAME@gmail.com","USERNAME@gmail.com")) { message.Subject = "Re: test"; message.Headers.Add("In-Reply-To", "<MESSAGEID@site.com>"); message.Headers.Add("References", "<MESSAGEID@site.com>"); smtpClient.Send(message); }
از این ID در ایمیلهای بعدی جهت ارجاع به آن و نمایش Thread مانند آنها، به کمک فیلدهای In-Reply-To و References، استفاده خواهیم کرد.
برای مثال هدر اطلاع رسانی شروع یک بحث جدید به صورت ذیل است:
message.Headers.Add("Message-ID", $"<post/{post.id}@your-app-name.example>");
message.Headers.Add("Message-ID", $"<comments/{comment.id}@your-app-name.example>"); message.Headers.Add("In-Reply-To", $"<post/{post.id}@your-app-name.example>"); message.Headers.Add("References", $"<post/{post.id}@your-app-name.example>");
- Create Database
- Delete Database
- Migrate Database
- Seed Database
services.AddParbad() .ConfigureDatabase(builder => { // Choose your database provider (SQL Server, MySql, Sqlite, etc.) builder.Use.... }) .ConfigureDatabaseInitializer(builder => { builder.UseInitializer(async context => { await context.Database.EnsureDeletedAsync(); // OR await context.Database.EnsureCreatedAsync(); // OR await context.Database.MigrateAsync(); }); });
services.AddParbad() .ConfigureDatabase(builder => { // Choose your Entity Framework provider (SQL Server, MySql, Sqlite, etc.) builder.Use.... }) .ConfigureDatabaseInitializer(builder => { builder.CreateDatabase(); // OR builder.DeleteAndCreateDatabase(); // OR builder.CreateAndMigrateDatabase(); });
services.AddParbad() .ConfigureDatabase(builder => { // SQL Server builder.UseSqlServer("Connection String", options => options.UseParbadMigrations()); }) .ConfigureDatabaseInitializer(builder => { builder.CreateAndMigrateDatabase(); });
builder.UseSqlServer("Connection String", options => options.MigrationsAssembly("Parbad"));
نمونه مثالها را همچنین میتوانید در صفحه GitHub پروژه مشاهده کنید.
آموزش عالی برای کسانی که میخواهند WPF و الگوی MVVM و CODE FIRST رو باهم یاد بگیرند :
At the core of developing a data-driven WPF application is a thorough knowledge of how to use the MVVM Pattern and Entity Framework. In this course, Building an Enterprise App with WPF, MVVM, and Entity Framework Code First, you will learn the skills you need to create high-quality enterprise applications with WPF. First, you'll learn about typical scenarios like communicating between different ViewModels, detecting model changes, and handling many-to-many relations. Next, you'll learn all about creating a tabbed user interface. Finally, you'll explore implementing optimistic concurrency and styling your application. When you're finished with this course, you will have a deep understanding of WPF, MVVM, and Entity Framework that will help you immensely as you move forward and create your own data-driven enterprise application
تنظیمات مقدماتی GitHub
در ابتدا نیاز است یک مخزن کد خالی را در GitHub ایجاد کنید. برای این منظور به برگهی Repositories در اکانت GitHub خود مراجعه کرده و بر روی دکمهی New کلیک کنید:
سپس در صفحهی بعدی، نام پروژه را به همراه توضیحاتی وارد نمائید و بر روی دکمهی Create repository کلیک کنید. در اینجا سایر گزینهها را انتخاب نکنید. نیازی به انتخاب گزینهی READ ME و یا انتخاب مجوز و غیره نیست. تمام این کارها را در سمت پروژهی اصلی میتوان انجام داد و یا VS.NET فایلهای ignore را به صورت خودکار ایجاد میکند. در اینجا صرفا هدف، ایجاد یک مخزن کد خالی است.
از اطلاعات صفحهی بعدی، تنها به آدرس مخصوص GitHub آن نیاز داریم. از این آدرس در VS.NET برای ارسال اطلاعات به سرور استفاده خواهیم کرد:
تنظیمات VS.NET برای ارسال پروژه به مخزن GitHub
پس از ایجاد یک مخزن کد خالی در GitHub، اکنون میتوانیم پروژهی خود را به آن ارسال کنیم. برای این منظور از منوی File، گزینهی Add to source control را انتخاب کنید و در صفحهی باز شده، گزینهی Git را انتخاب نمائید:
سپس در کنار برگهی Solution Explorer، برگهی Team Explorer را انتخاب کنید. در اینجا بر روی دکمهی Home در نوار ابزار آن کلیک کرده و سپس بر روی دکمهی Unsynced commits کلیک نمائید.
در ادامه در صفحهی باز شده، همان آدرس مخصوص مخزن کد جدید را در GitHub وارد کرده و بر روی دکمهی Publish کلیک کنید:
در اینجا بلافاصله صفحهی لاگینی ظاهر میشود که باید در آن مشخصات اکانت GitHub خود را وارد نمائید:
به این ترتیب عملیات Publish اولیه انجام شده و تصویر ذیل نمایان خواهد شد:
در اینجا بر روی دکمهی Sync کلیک کنید. به این ترتیب مخزن کد GitHub به پروژهی جاری متصل خواهد شد:
سپس نیاز است فایلهای موجود را به مخزن کد GitHub ارسال کرد. بنابراین پس از مشاهدهی پیام موفقیت آمیز بودن عملیات همگام سازی، بر روی دکمهی Home در نوار ابزار کلیک کرده و اینبار گزینهی Changes را انتخاب کنید:
در اینجا پیام اولین ارسال را وارد کرده و سپس بر روی دکمهی Commit کلیک کنید:
پس از مشاهدهی پیام موفقیت آمیز بودن commit محلی، نیاز است تا آنرا با سرور نیز هماهنگ کرد. به همین جهت در اینجا بر روی لینک Sync کلیک کرده و در صفحهی بعدی بر روی دکمهی Sync کلیک کنید:
اندکی صبر کنید تا فایلها به سرور ارسال شوند. اکنون اگر به GitHub مراجعه کنید، فایلهای ارسالی قابل مشاهده هستند:
اعمال تغییرات بر روی پروژهی محلی و ارسال به سرور
در ادامه میخواهیم دو فایل README.md و LICENSE.md را به پروژه اضافه کنیم. پس از افزودن آنها، یا هر تغییر دیگری در پروژه، اینبار برای ارسال تغییرات به سرور، تنها کافی است به برگهی Team explorer مراجعه کرده و ابتدا بر روی دکمهی Home کلیک کرد تا منوی انتخاب گزینههای آن ظاهر شود. در اینجا تنها کافی است گزینهی Changes را انتخاب و دقیقا همان مراحل عنوان شدهی پیشین را تکرار کرد. ابتدا ورود پیام Commit و سپس Commit. در ادامه Sync محلی و سپس Sync با سرور.
This repo contains the code samples, exercises and solutions for the book Functional Programming in C# published by Manning.