معرفی Orleans 3.0
Major changes since Orleans 2.0
A new scheduler, which alone increased performance by over 30% in some cases
A new code generator based on Roslyn code analysis
Rewritten cluster membership for improved recovery speed
Co-hosting support
I was pleasantly surprised by how easy it was to setup and install ASP.NET Core 2.1 on Linux. I did it for the first time in 15 minutes with no previous experience with .NET Core on Linux. I did it the second time, in production, in 5 minutes by following these instructions.
In this article, I show you how to install the .NET Core runtime on CentOS, how to get a sample ASP.NET Core project running on Kestrel as a service for reliability, and how to configure both the code and the firewall to enable remote access. Finally, I discuss what I would do differently for actual production usage.
کار این الگو در یک جمله این است که اگر متدی نتواند خروجی مناسبی را بدهد و به جای آن قرار باشد نال را برگشت دهد، به جای برگشت دادن نال، از یک شیء که هیچ رفتاری ندارد استفاده میکند و آن شیء را برمیگرداند تا در ادامه کد، بررسی نال بودن، یا خطای NPE رخ ندهد.
به عنوان مثال فرض کنید قرار است یک کاربر با نام کاربری Ali به سیستم وارد شود؛ در اینجا سه حالت وجود دارد:
- این کاربر یافت شده و اجازه دسترسی دارد.
- این کاربر یافت شده و اجازه دسترسی ندارد.
- این کاربر یافت نمیشود.
اگر در حالتیکه کاربر یافت نشود، بخواهیم نال برگردانیم، در ادامهی کد باید بررسی نال بودن و یا گاها انتظار خطای NPE را داشته باشیم؛ یا اینکه در عوض از الگوی شیء نال بهره ببریم.
بدون استفاده از الگو
در این مثال ابتدا کلاس یوزر را میسازیم:
public class User { public String Usernam { get; set; } public bool Authenticated { get; set; } }
public User GeUser(string uname) { if (uname == "Ali") { return new User() { Usernam = "Ali", Authenticated = true }; } else if (uname == "Reza") { return new User() { Usernam = "Reza", Authenticated = false }; } else { return null; } }
var userServices=new UserServices(); var user = userServices.GeUser("Ali"); if (user != null && user.Authenticated) { Console.WriteLine("You are Authorized"); }
استفاده از الگو
ابتدا یک کلاس جدید را با ارث بری از کلاس یوزر میسازیم:
public class NullUser:User { public NullUser() { Authenticated = false; } }
public User GeUser(string uname) { if (uname == "Ali") { return new User() { Usernam = "Ali", Authenticated = true }; } else if (uname == "Reza") { return new User() { Usernam = "Reza", Authenticated = false }; } return new NullUser(); }
var userServices=new UserServices(); var user = userServices.GeUser("xxx"); if (user.Authenticated) Console.WriteLine("You are Authorized");
یک نکته اضافه تر اینکه، در صورتی که قصد دارید متدی را در کلاس پدر تحریف کنید، بهتر است یک اینترفیس یا کلاس انتزاعی را تعریف و هر دو کلاس را از آن ارث بری کنید که برای مثال بالا میشود اینترفیس IUser و دو کلاس User و NullUser هم مشتقات آن.
با liveshare میتوانید بدون کلون کردن ریپوزیتوری، به صورت هماهنگ با اعضای تیم و به صورت realtime کد خود را ویرایش یا دیباگ کنید:
If you haven’t heard of Live Share, it’s a tool that enables real-time collaborative development with your teammates from the comfort of your own tools. You’re able to share your code, and collaboratively edit and debug, without needing to clone repos or set up environments. It’s easy to get started with Live Share.
- اول، ابزار Microsoft ASP.NET Scaffolding را از منوی Tools گزینه Extensions and Updates دریافت و نصب نمایید.
- دوم پروژه جدیدی از نوع Visual C# ASP.NET Web Forms Application با فریم ورک 4.5 ایجاد نمایید.
- از پنجره NuGet Package manager با دستور install کتابخانه ASP.NET Web Forms Scaffold Generator را دریافت نمایید
install-package Microsoft.AspNet.Scaffolding.WebForms -pre
- کلاس Person را مانند زیر در فولدر Models ایحاد نماییدویژگی ScaffoldColumn را برای ID، برابر false قرار دهید تا از ایجاد این ستون جلوگیری نمائید.
public class Person { [ScaffoldColumn(false)] public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
- پروژه را Build نمایید.
- بر روی پروژه راست کلیک و از گزینه Add، گزینه ...Scaffold را انتخاب نمایید.
- از پنجره Add Scaffold باز شده بر روی گزینه Add، کلیک کنید.
- پنجره
Add Web Forms Pages مانند زیر باز میشود که امکان انتخاب کلاس،Data Context و MasterPage فراهم میباشد.
- از گزینه Data Context class گزینه New Data Context را انتخاب نمایید. صفحات مورد نیاز را در فولدر Views/Person ایجاد مینمایید.
- کدهای تولید شده را میتوانید بازبینی نمایید پروژه را اجرا تا خروجی کار را مشاهده نمایید.
C# در مرورگر با Blazor
Blazor is the new Microsoft experimental framework that brings C# into any browser without a plug-in. It holds the promise of modern single-page applications, combined with the ability to use C# and its vast base-class library. Blazor takes C# development to a new level. It’s the final piece necessary to make the language a full-stack development tool. It will have all the power of the popular JavaScript frameworks, but based on the familiar languages, APIs and tooling of the Microsoft .NET Framework.
Bootstrap Icons v1.10.0 منتشر شد
Bootstrap Icons v1.10.0 is here with nearly 150 new icons. This release includes tons of new variants for person, building, and database icons, plus new brands, rockets, road signs, globes, and many more. We’re now at over 1,900 icons!
یکی از استفادههای این الگو برای مثال در پلیرهاست که وضعیت پخش را چون Play,Pause و ... در خود دارند. در اینجا هم از این مثال استفاده میکنیم:
ابتدا یک اینترفیس برای وضعیت خود بسازید که آرگومان ورودی متد آن را در مرحله بعد تعریف میکنیم:
public interface IState { void PressPlay(MP3PlayerContext context); }
public class MP3PlayerContext { public MP3PlayerContext() { this.CurrentState = new StandbyState(); } public MP3PlayerContext(IState state) { this.CurrentState = state; } public IState CurrentState { get; set; } public void Play() { this.CurrentState.PressPlay(this); } }
public class StandbyState : IState { public void PressPlay(MP3PlayerContext context) { context.CurrentState = new PlayingState(); } } public class PlayingState : IState { public void PressPlay(MP3PlayerContext context) { context.CurrentState = new StandbyState(); } }
بدین ترتیب در اولین اجرای متد Play در کلاس Context، کلاس PlayingState اجرا میشود و وضعیت، به StandbyState تغییر میکند و هر بار که مجددا متد Play اجرا گردد، تعویض بین این دو کلاس صورت میگیرد.