NET Standard. در حقیقت یک قرار داد است که سکوهای کاری مختلف دات نتی مانند Full .NET Framework ، Xamarin ، Mono ، UWP و غیره میتوانند آنرا پیاده سازی کنند. یک نمونهی دیگر این پیاده سازیها نیز NET Core. است. برای مثال دات نت 4.6.1، استاندارد و قرار داد شمارهی 2 دات نت را پیاده سازی میکند. به همین صورت NET Core 2.0. نیز پیاده سازی کنندهی این استاندارد شماره 2 است.
«اما» باید درنظر داشت که دات نت استاندارد، بیش از یک قرار داد چیزی نیست و پیاده سازی کنندگان آن میتوانند سطح بیشتری را نسبت به این قرار داد نیز لحاظ کنند. برای مثال دات نت 4.6.1 شامل سطح API بیشتری از دات نت استاندارد 2 است.
با تغییرات اخیر، اکنون NuGet میتواند کتابخانههای مبتنی بر NET Standard 2. را در برنامههای مبتنی بر سکوهای کاری که آنرا پیاده سازی میکنند، بدون مشکل اضافه کند. برای مثال میتوان اسمبلیهای دات نت 4.6.1 را به برنامههای ASP.NET Core 2.0 اضافه کرد (کاری که در نگارش 1x آن به صورت مستقیم میسر نیست) و یا میتوان اسمبلیهای کامپایل شدهی برای دات نت استاندارد 2 را به برنامههای مبتنی بر دات نت 4.6.1 اضافه کرد.
«اما» باید درنظر داشت که امکان اضافه کردن یک بستهی نیوگت از یک کتابخانهی نوشته شدهی برای دات نت کامل در برنامههای دات نت Core به معنای تضمینی برای کار کردن آن در زمان اجرا نخواهد بود. از این جهت که دات نت کامل، به همراه قسمتهایی است که در NET Standard. وجود خارجی ندارند. بنابراین اگر کتابخانهی استفاده شده صرفا این API مشترک را هدف قرار دادهاست، هم قابلیت اتصال و هم قابلیت اجرا را خواهد داشت؛ اما اگر برای مثال کسی بستهی NServiceBus را به پروژهی ASP.NET Core 2.0 اضافه کند، بدون مشکل کامپایل خواهد شد. اما از آنجائیکه این کتابخانه از MSMQ استفاده میکند که خارج از میدان دید این استاندارد است، در زمان اجرا با شکست مواجه خواهد شد.
نحوهی سفارشی سازی کلاس پایهی تمام Viewهای برنامه و معرفی inherits@
در نگارشهای پیشین ASP.NET MVC، امکان تعویض کلاس پایهی Viewها، در فایل web.config واقع در پوشهی ریشهی Views وجود داشت. با حذف این فایل و ساده سازی و محول کردن مسئولیتهای آن به فایل جدید view imports، اینبار برای تعریف کلاس پایهی viewها میتوان به صورت ذیل عمل کرد:
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Razor; namespace Core1RtmEmptyTest.StartupCustomizations { public abstract class MyCustomBaseView<TModel> : RazorPage<TModel> { public bool IsAuthenticated() { return Context.User.Identity.IsAuthenticated; } #pragma warning disable 1998 public override async Task ExecuteAsync() { } #pragma warning restore 1998 } }
پس از تعریف این کلاس، برای ثبت و معرفی آن به فایل ViewImports.cshtml_ مراجعه کنید و این یک سطر را به ابتدای آن اضافه نمائید:
@inherits Core1RtmEmptyTest.StartupCustomizations.MyCustomBaseView<TModel>
برای نمونه پس از سفارشی سازی صفحهی پایهی تمام Viewها، اکنون یک سطر ذیل را در هر view ایی میتوان تعریف و استفاده کرد:
Is Current User Authenticated? @IsAuthenticated()
معرفی functions@
دایرکتیو جدید functions@، بسیار شبیه است به دایرکتیو قدیمی و حذف شدهی helper@، که در نگارشهای پیشین Razor معرفی شده بود:
@functions { public string Test() { return message; } readonly string message = "test"; }
@Test() <br /> @message
معرفی inject@
توسط دایرکتیو جدید inject@، یک خاصیت عمومی به ASP.NET Core اعلام میشود و سپس مقدار دهی آن بر اساس تنظیمات IoC Container برنامه به صورت خودکار صورت خواهد گرفت. برای مثال زمانیکه میخواهیم به سرویس توکار HostingEnvironment در یک View دسترسی پیدا کنیم، میتوان در ابتدای آن نوشت:
@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment Host;
[Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] public Microsoft.AspNetCore.Hosting.IHostingEnvironment Host { get; private set; }
اکنون برای استفادهی از آن خواهیم داشت:
<div> Running in @Host.EnvironmentName </div>
به علاوه باید دقت داشت اگر تعریف inject@ فوق را در فایل view import قرار دهیم، این سرویس در اختیار تمام Viewهای برنامه قرار خواهد گرفت و دیگر نیازی به قرار دادن آن در یک کلاس پایهی سفارشی نیست.
یکی از مفیدترین استفادههای از قابلیت تزریق سرویسها در Viewها میتواند دسترسی به سرویس تامین تنظیمات برنامه باشد (که در مورد نحوهی تامین آن در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایلهای config» بیشتر بحث شد):
@inject IOptions<SmtpConfig> Settings;
نحوه صحیح تولید Url در ASP.NET MVC
app.UseMvc(routes => { routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); });
ایجاد لینک بدون استفاده از تگ هلپر <a href="Home/Details/@student.Id">View Details</a>
ایجاد لینک با استفاده از تگ هلپر <a asp-controller="Home" asp-action="Details" asp-route-id="@student.Id">View Details </a>
خروجی حاصل <a href="Home/Details/1">View Details</a> <a href="/Home/Details/1">View Details</a>
app.UseMvc(routes => { routes.MapRoute("default", "uni/{controller=Home}/{action=Index}/{id?}"); });
<a href="Home/Details/1">View Details</a>
<a href="/Uni/Home/Details/1">View Details</a>
مدل پیکره بندی جدید در ASP.NET CORE
ASPNET Core has a lot of changes compared with the others versions of ASP.NET. One change I want to highlight is the new way to configure settings. With previous versions, this configuration was made by using the common file web.config, but this file simply doesn’t exist anymore in ASP.NET Core. Instead, a new easy way to declare and access to the settings is provided. Let’s take a look.