سیستم بلاگ cloudscribe.SimpleContent
نوشتن Middleware سفارشی در ASP.NET Core
NET Core SDK 3.1.403. منتشر شد
public class FaLanguageActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { CultureInfo.CurrentCulture = new CultureInfo("fa-IR"); CultureInfo.CurrentUICulture = new CultureInfo("fa-IR"); base.OnActionExecuting(context); } }
+ برای تنظیم اطلاعات تکراری Viewها میتوان کلاس پایه آنها را نیز سفارشی سازی کرد:
public abstract class MyCustomBaseView<TModel> : RazorPage<TModel> { protected MyCustomBaseView() { CultureInfo.CurrentCulture = new CultureInfo("fa-IR"); CultureInfo.CurrentUICulture = new CultureInfo("fa-IR"); }
در متن آمده که EF Core به صورت پیش فرض ، Db Context را به صورت Scoped ثبت میکند. و نحوه تزریق از طریق سازنده کلاسها است. از طرفی اگر درست متوجه شده باشم در مستندات ماکروسافت هشدار داده شده که این مدل طول حیات را نباید از طریق سازنده تزریق کرد.
When using a scoped service in a middleware, inject the service into the Invoke or InvokeAsync method. Don't inject via constructor injection because it forces the service to behave like a singleton. For more information, see Write custom ASP.NET Core middleware.
همچنین شما گفتید که "سرویسهای Scoped در محدودهی درخواست، مانند Singleton عمل میکنند و شیء ساخته شده و وضعیت آن در بین تمامی سرویسهایی که به آن نیاز دارند، مشترک است. بنابراین باید به این نکته در هنگام تعریف سرویس به صورت Scoped ، توجه داشته باشید."
در پروژهای که روی آن کار میکنم (ASP.NET Core Razor Pages) یک کلاس validation هست که میخوام به عنوان یک سرویس به کلاس هر صفحه تزریق بشه. اگر امکانش هست توضیح بدید که بر اساس مواردی که در بالا آوردم و هدفی که دارم آیا بین حالات singleton و scoped فرقی وجود دارد؟
ممنون.
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.
نحوهی سفارشی سازی کلاس پایهی تمام 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;