یک پروژهی ASP.NET Core را با قرار دادن نسخهی NET Core. بر روی 3.1 و با استفاده از قالب Model View Controller ایجاد کنید. در اینجا نام پروژه را AspNetCoreDependencyInjection گذاشتهام. حالا در پوشهی Models، فایلی را با نام HomeViewModel.cs با محتویاتی به صورت زیر اضافه کنید: public class HomeViewModel
{
public string Id { get; set; }
public string Message { get; set; }
public DateTime DateTime { get; set; } ...
مقدمه
زمانیکه یک برنامه را بر پایهی شیء گرایی طراحی میکنید و مینویسید، به صورت معمول جریان وابستگیها در برنامهی شما به صورت زیر است:
در این حالت برای کامپایل شدن برنامه نیاز است که فرآیند کامپایل از دورترین کلاس و متد شروع شود. همانطور که میبینید در اینجا هر کلاس به تمام زیر کلاسهای خود وابسته است و هر تغییر در هر کدام از کلاسهای خدمتگزار میتواند تاثیرات مستقیمی بر روی سایر ...
خودکارسازی، در قسمتهای مختلف یک پروژه میتواند انجام شود. نمونههای مختلف این خودکارسازیها که اکثرا توسط رفلکشن انجام میشوند شامل نگاشت خودکار Dto به Entity و بالعکس (توسط AutoMapper) ، ثبت خودکار تمام Entityها در DbContext بدون نیاز به ثبت تک تک آنها به صورت public DbSet<Person> People { get; set; } (که در این روش خودکار، اسم جداول میتواند به صورت جمع ثبت شود)، ثبت خودکار EntityTypeConfigurationها، ثبت خودکار کلیهی کلا ...
در قسمت قبل دیدیم که انجام کارهای همزمان، با Objectهایی که به اصطلاح Thread Safe نیستند (مانند DbContext) خروجی چندان جالبی ندارد و برای مثال اگر در یک Service یک DbContext را Inject کنیم (مثلا با Constructor injection) و از آن در متدی استفاده کنیم که آن متد یا با TPL یا RX و ... به صورت چندتایی و همزمان اجرا شود، DbContext به مشکل میخورد ؛ یعنی نمیتوان یک وهله از DbContext را بین چند Thread همزمان پردازش موازی، به اشتراک گذاشت. ...
علاوه بر امکان تنظیم مقدار خروجی متدها ، مقدار خواص و ردیابی خواص تغییر کرده ، یکی دیگر از قابلیتهای کتابخانهی Moq، بررسی مورد استفاده قرار گرفتن خواص و متدهای اشیاء Mock شدهاست، که عموما به آن Behavior based testing هم میگویند.
Behavior Based Testing چیست؟
آزمونهایی را که تاکنون بررسی کردیم از نوع state based testing بودند. در این حالت ابتدا یک Mock object را ایجاد و سپس وهلهای از سرویس مدنظر را توسط آن ته ...
در قسمت قبل ، نحوهی پیاده سازی الگوی Decorator را با استفاده از امکانات تزریق وابستگیهای NET Core. بررسی کردیم؛ اما ... این روزها کسی Decoratorها را دستی ایجاد نمیکند. یعنی اگر قرار باشد به ازای هر کلاسی و هر سرویسی، یکبار کلاس Decorator آنرا با پیاده سازی همان اینترفیس سرویس اصلی و فراخوانی دستی تک تک متدهای سرویس اصلی تزریق شدهی در سازندهی آن انجام دهیم، آنچنان کاربردی به نظر نمیرسد. به همین منظور کتابخانههایی تحت عنوان Dynamic ...
الگوی decorator، امکان محصور کردن یک شیء مفروض را با لایهای بر فراز آن میسر میکند. برای مثال بجای اینکه در تمام متدهای سرویسی از try/catch استفاده کنیم، میتوانیم این متدها را با یک ExceptionHandlingDecorator مزین کنیم و یا از این دست اعمال تکراری میتوان به لاگ کردن ورودی و خروجیهای یک متد و یا کش کردن اطلاعات آنها نیز اشاره کرد. حتی عملیاتی مانند تشخیص خواص تغییر یافتهی یک شیء در Entity framework نیز به کمک همین مزین کنندهها که شیء ...
فرض کنید در برنامهی خود، یک سرویس جنریک را طراحی کردهاید. برای مثال خود ASP.NET Core به همراه سرویس جنریک <ILogger<T است و اگر برای نمونه بخواهیم آنرا در سازندهی کنترلری مانند ValuesController تزریق کنیم، نحوهی تعریف آن به صورت <ILogger<ValuesController خواهد بود. هر چند تنظیمات این سرویس پیشتر انجام شدهاست، اما اگر بخواهیم آنرا به همین نحو <ILogger<T به متدهایی مانند services.AddScoped معرفی کنیم، کار نمیکند؛ نمو ...
قابلیتهای قرار گرفتهی در اسمبلی Microsoft.Extensions.DependencyInjection که پایهی تزریق وابستگیهای برنامههای مبتنی بر NET Core. را ارائه میدهد، برای پیاده سازی اکثر پروژهها کافی است. اما اگر از نگارشهای پیشین ASP.NET MVC به ASP.NET Core مهاجرت کرده باشید، حتما با قابلیتهای ویژهی اسکن اسمبلیهای موجود در IoC Containers ثالث، جهت ساده سازی معرفی سرویسهای برنامه به سیستم تزریق وابستگیها، آشنایی دارید. برای مثال StructureMap قابلیت ...
فرض کنید قرارداد IService را تدارک دیدهاید و بر اساس آن سرویسهای A و B را به سیستم تزریق وابستگیهای برنامههای NET Core. تزریق کردهاید (برای مثال در برنامه دو DbContext را تعریف کردهاید و یک اینترفیس IUnitOfWork را دارید). اکنون اگر از این سیستم، یک پیاده سازی IService را درخواست کنید، چه اتفاقی رخ میدهد؟ در حالت معمول آن، آخرین سرویسی را که ثبت کردهاید، یعنی وهلهای از سرویس B را بازگشت خواهد داد. در ادامه قصد داریم با این قابلیت ا ...