For an application, logging is very important to keep track of that application and keep it error-free. In .NET Core, we don't need any third party logging; instead, we can use built-in logging whenever we want. This is very efficient in terms of code and performance.
Let’s start. Create a new .NET Core application and name it.
This lets you do things that you can’t do in WebAPI’s default binder, specifically:
- ModelBinds everything, including the body. Assumes the body is FormUrl encoded
- This means you can do MVC scenarios where a complex type is bound with one field from the query string and one field from the form data in the body.
- Allows multiple parameters to be bound from the body.
همانطور که عنوان شد به ماژولهای داخلی، فضاهای نام (namespace) گفته میشود. بنابراین از namespaceها نیز جهت مدیریت و ساماندهی پروژههای بزرگ با تعداد فایلهای زیاد استفاده میشود. در واقع یک namespace حالت سادهتری از یک ماژول است؛ یعنی برای بارگذاری آن در مرورگر نیاز به loader خاصی نیست. بنابراین در پروژههایی با مقیاس کوچکتر استفاده از namespaceها، انتخاب بهتری است. همچنین یکی از مزیتهای مهم namespace جلوگیری از شلوغ شدن global scope است.
نحوهی تعریف namespace در TypeScript
برای ایجاد یک namespace کافی است از کلمه کلیدی namespace استفاده کنیم:
namespace Membership { export function AddMember(name: string) { // add a new member } }
در کد فوق یک namespace را با نام Membership تعریف کردهایم. درون این namespace میتوانیم کدهای خود را بنویسیم. به عنوان مثال در کد فوق یک تابع را با نام AddMember درون آن تعریف کردهایم و با استفاده از کلمهی کلیدی export این تابع را در معرض دید مصرف کننده قرار دادهایم. لازم به ذکر است که یک namespace میتواند به صورت nested (تودرتو) نیز استفاده شود. اما باید توجه داشته باشید که برای داشتن چنین قابلیتی باید از export نیز قبل از کلمهی کلیدی namespace استفاده شود:
namespace Membership { export function AddMember(name: string) { // add a new member } export namespace Cards { export function IssueCard(memberNumber: number) { // issue new card } } }
همانطور که مشاهده میکنید، درون یک nested namespace نیز میتوانیم اشیاء را توسط کلمهی کلیدی export در معرض دید مصرف کننده قرار دهیم.
نحوهی استفاده از namespaceها در TypeScript
برای استفاده از کدهای مثال قبل، در یک فایل دیگر میتوانیم به صورت زیر یک ارجاع را به namespace مربوطه داشته باشیم:
/// <reference path="membership.ts" />
اکنون درون ادیتور، به صورت کامل به اشیاء export شدهی توسط فضای نام Membership دسترسی خواهید داشت. لازم به ذکر است به این نوع ارجاع، Triple-Slash References نیز گفته میشود. مزیت دیگر این روش این است که کامپایلر TypeScript ارجاعات را نیز کامپایل میکند.
برای استفاده از اشیاء مربوط به namespace ارجاع داده شده نیز باید از سینتکس نقطه استفاده کرد:
Membership.AddMember('Garrett'); Membership.Cards.IssueCard(500);
نکتهایی که در اینجا وجود دارد این است که کامپایلر TypeScript به صورت پیشفرض فایلهای ارجاع داده شده را به فایلهای جداگانهایی کامپایل خواهد کرد و فرض را بر این خواهد گذاشت که هر کدام از فایلهای کامپایل شده قرار است به ترتیب استفاده از آنها درون صفحه استفاده شوند. برای تولید یک فایل واحد میتوانید از فلگ outFile استفاده کنید. با کمک این فلگ تمامی ارجاعات، بر اساس ترتیب استفاده از آنها، به یک فایل واحد تبدیل خواهند شد. جهت درک بهتر موضوع، یک فایل را با نام utilityFunctions.ts با محتویات زیر ایجاد کنید:
namespace Utility { export namespace Fees { export function CalculateLateFee(daysLate: number): number { return daysLate * .25; } } export function MaxBooksAllowed(age: number): number { if (age < 12) { return 3; } else { return 10; } } function privateFunc(): void { console.log('This is private....'); } }
در کد فوق یک namespace با نام Utility ایجاد کردهایم سپس یک namespace دیگر و همچنین یک تابع را درون آن export کردهایم. اکنون میخواهیم از این فضای نام درون یک فایل دیگر با نام app.ts استفاده کنیم. برای اینکار دورن فایل app.ts با استفاده از Triple-Slash یک ارجاع را به فضای نام عنوان شده اضافه کنید:
/// <reference path="utilityFunctions.ts" />
اکنون میتوانیم از Intellisense مربوط به VS Code جهت دسترسی به اعضای فضای نام Utility استفاده کنیم:
لازم به ذکر است برای namespace مربوطه میتوانیم alias نیز جهت دسترسی سریعتر، تعریف کنیم:
/// <reference path="utilityFunctions.ts" /> import util = Utility.Fees; let fee = util.CalculateLateFee(10); console.log(`Fee: ${fee}`);
توسط فرمان زیر نیز میتوانیم فایل فوق را به راحتی کامپایل کنیم:
tsc --target ES5 app.ts
با فرمان فوق، فایل app.js به همراه تمامی فایلهای ارجاع داده شدهی درون آن نیز کامپایل خواهند شد.
اکنون اگر بخواهیم توسط node فایل app.js را اجرا کنیم، با خطای ReferenceError: Utility is not defined مواجه خواهیم شد. دلیل آن نیز این است که node سعی در لود کردن فایل به صورت یک ماژول دارد و از آنجائیکه ما از namespace استفاده کردهایم، فضای نام Utility توسط node قابل شناسنایی نمیباشد. اما درون یک صفحهی HTML با قرار دادن فایل utilityFunctions.js و سپس app.js مشکلی نخواهیم داشت. برای حل این مورد در node کافی است از نکتهی یکی کردن فایلها استفاده کنیم:
tsc --target ES5 app.ts --outFile out.js
در اینحالت فایلها به ترتیب استفاده، با هم ادغام شده و تبدیل به یک فایل با نام out.js خواهند شد.
VSCode برای توسعه دهندگان سیشارپ
VSCode for the C# Developer - Tim Corey - NDC London 2023
VSCode is a nimble editor that can do just about anything. In this session, we will set up and configure VSCode for use in C# development. Then we will use it to build, debug, and deploy a small .NET Core web application to Azure.
Along the way, we will go over a list of the top C#-focused plugins for VSCode. Whether you are just getting started with VSCode or you are used to VSCode but want to start building C# projects, this session will get you up to speed fast.
In this section, I’m going to cover how you can use SignalR outside of a Hub. In most asp.net core applications, you will likely want to communicate with the connect clients from within your application but outside of a Hub. You can accomplish this by using the HubContext.
For example, an ASP.NET Core MVC Controller or any other class that is instantiated by ASP.NET Core’s Dependency Injection.
The HubContext allows you to send messages to your connected clients. It has many of the same features to communicate with clients as when you are inside of a Hub.