مطالب
چگونه نرم افزارهای تحت وب سریعتری داشته باشیم؟ قسمت هفتم
قسمت ششم 

20.اسکریپت در پایین صفحه
لینک‌های مربوطه به javascript‌های خود را تا جای ممکن در پایین صفحه قرار دهید. وقتی parser مرورگر به فایل‌های javascript می‌رسد، تمامی فعالیت‌ها را متوقف کرده و سعی در دانلود و سپس اجرای آن دارد. برخلاف اینکه مرورگرها امکان دانلود چند فایل را به صورت همزمان از سرور دارند، هنگامی که به اسکریپت‌ها می‌رسند، تنها یک فایل را دانلود می‌کنند. یعنی اجرای برنامه و دانلودهای مرتبط با صفحه شما متوقف شده و پس از دانلود و اجرای اسکریپت اجرای آنها ادامه پیدا می‌کند. این مسئله وقتی نمود بیشتری پیدا می‌کند که شما فایل هغای اسکریپت با حجم و تعداد بالا در برنامه خود استفاده می‌کنید.
برای فرار از این مشکل می‌توانید تگهای مربوط به اسکریپت را در آخر صفحات خود بگذارید. فقط دقت کنید اگر نیاز است که قبل از نمایش صفحه تغییری ذر DOM ایجاد کنید، باید حتما اسکریپت‌های مربوطه را بالای صفحه قرار دهید.
روش دیگر دانلود فایل‌های اسکریپت به وسیله AJAX است که انشاء الله در آینده مقاله ای در این رابطه خواهم نوشت.

21.CDN
CDN یا Content Delivery Network سرورهای توزیع شده ای در سطح دنیا هستند که یک نسخه از برنامه شما برای اجرا بر روی آن قرار دارد. هنگامی که کاربر می‌خواهد به سایت شما دسترسی پیدا کند به صورت خودکار به نزدیکترین سرور منتقل می‌شود تا بتواند سرعت بیشتری را تجربه کند. علاوه بر این CDN باعث بالانس شدن بار ترافیک شبکه شما شده خط حملات D.O.S و D.D.O.S را به حداقل می‌رساند.

زمانیکه شما یک سیستم CDN را فعال میکنید تاثیر آن بصورت زیر خواهد بود:
۱- شبکه توزیع محتوا یا همان CDN تمامی سرورهای شبکه جهانی اینترنت را پوشش میدهد. بنابراین زمانیکه شما این سیستم را برای سایت خود فعال میکنید اطلاعات شما بر روی تمامی این سرورها کپی و ذخیره میشود و زمانیکه یک بازدیدکننده به سایت یا وبلاگ شما وارد میشود محتوای سایت شامل تصاویر و متون را از نزدیک‌ترین سرور نزدیک به خود دریافت میکند و مستقیما به هاست یا سرور شما متصل نمیشود. این کار موجب بهبودی چشمگیر در عملکرد سایت شما خواهد شد.
۲- CDN تمام اطلاعات ثابت شما مانند تصاویر، کدهای CSS و javascript، mp3، pdf و فایلهای ویدئویی شما را پشتیبانی میکند و تنها اطلاعاتی که قابل تغییر و بروزرسانی هستند مانند متون و کدهای HTML از سرور اصلی شما فراخوان میشوند. با این کار مصرف پهنای باند هاست شما کاهش یافته و هزینه ای که سالانه برای آن میپردازید کاهش چشمگیری خواهد داشت.
۳- تفاوت سرعت و عملکرد برای خودتان یا افرادی که در نزدیکی سرور اصلی شما هستند تفاوت زیادی نخواهد داشت ولی برای کسانی که ار نقاط مختلف جهان به سایت شما وارد میشوند این افزایش سرعت ناشی از CDN کاملا محسوس خواهد بود، با توجه به اینکه سایتهای ایرانی معمولا سرور و هاست خود را از خارج و کشورهایی مانند آلمان و آمریکا تهیه میکنند و عموم بازدیدکنندگان از داخل کشور هستند استفاده از CDN میتواند بسیار موثر باشد. برای تعیین تاثیر CDN بر سرعت سایت میتوانید عملکرد خود را با ابزارهایی مانند Pingdom و GTmetrix بعد و قبل از فعال سازی CDN بررسی و مقایسه کنید. 
ابزارها، تکنیک‌ها و روش‌های متفاوتی برای راه اندازی CDN وجود دارد که نیازمند مقاله ای مجزا می‌باشد.
مطالب
خلاصه اشتراک‌های روز یک شنبه 1390/06/27

مطالب
لینک‌های هفته سوم آذر

وبلاگ‌ها و سایت‌های ایرانی


Visual Studio



ASP. Net


طراحی وب


اس‌کیوال سرور



Nhibernate


عمومی دات نت


ویندوز


متفرقه


مسیرراه‌ها
NHibernate
      مسیرراه‌ها
      MDX Query
      مسیرراه‌ها
      آزمون واحد در دات نت
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت اول
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت دوم
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت سوم
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت چهارم
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت پنجم
      آشنایی با آزمایش واحد (unit testing) در دات نت قسمت ششم

      آشنایی با mocking frameworks - قسمت اول
      آشنایی با mocking frameworks - قسمت دوم

      چگونه کد قابل تست بنویسیم - قسمت اول
      چگونه کد قابل تست بنویسیم - قسمت دوم

      Test Driven Development

      Microsoft Test Manager 

      نوشتن آزمون‌های واحد به کمک کتابخانه‌ی Moq  

      دیگر مقالات
      مسیرراه‌ها
      ASP.NET Core
      ASP.NET Core 1.0
      ASP.NET Core 2.0
      روش ارتقاء
      ASP.NET Core Identity 

      کار با Areas در ASP.NET Core
      کار با کوکی‌ها در ASP.NET Core
      بررسی روش آپلود فایل‌ها در ASP.NET Core
      ارسال ایمیل در ASP.NET Core
      نوشتن Middleware سفارشی در ASP.NET Core
      نوشتن TagHelperهای سفارشی برای ASP.NET Core
      بررسی تغییرات Reflection در NET Core.
      استفاده‌ی گسترده از DateTimeOffset در NET Core.
      بررسی روش دسترسی به HttpContext در ASP.NET Core
      توزیع پروژه‌های ASP.NET Core 1.1 بدون ارائه فایل‌های View آن
      تغییرات رمزنگاری اطلاعات در NET Core.
      ساخت بسته‌های نیوگت مخصوص NET Core.
      تهیه قالب برای ارسال ایمیل‌ها در ASP.NET Core توسط Razor Viewها
      روش یافتن لیست تمام کنترلرها و اکشن متدهای یک برنامه‌ی ASP.NET Core
      بررسی روش آپلود فایل‌ها از طریق یک برنامه‌ی Angular به یک برنامه‌ی ASP.NET Core
      سفارشی سازی صفحه‌ی اول برنامه‌های Angular CLI توسط ASP.NET Core
      تغییرات Encoding در NET Core.
      تغییرات متدهای بازگشت فایل‌ها به سمت کلاینت در ASP.NET Core
      پیاده سازی برنامه‌های چند مستاجری در ASP.NET Core
      مقدمه‌ای بر تزریق وابستگی‌ها درASP.NET Core 
      نمایش خطاهای اعتبارسنجی سمت سرور ASP.NET Core در برنامه‌های Angular
      احراز هویت و اعتبارسنجی کاربران در برنامه‌های Angular - قسمت اول - معرفی و ایجاد ساختار برنامه
      روش استفاده‌ی صحیح از HttpClient در برنامه‌های دات نت
      اجرای سرویسهای NodeJS در ASP.NET Core
      بررسی خطاهای ممکن در حین راه اندازی اولیه برنامه‌های ASP.NET Core در IIS 
      تست کردن متدهای یک Controller به کمک PowerShell
      کار با Visual Studio در ASP.NET Core

      مطالب
      معرفی کتاب NHibernate 3 Beginners Guide, Aug 2011

      در بیشتر مواردی که یک تکنولوژی جدید را برای یادگیری انتخاب می‌کنیم در اولین فرصت سراغ منابع آنلاین از قبیل کتابها و یا ویدئوهای موجود بر روی نت می‌رویم و در این بین ممکن است با محدودیت هایی از قبیل کیفیت بد اتصال به اینترنت و یا حجم مربوط به فایلهای موجود مواجه شویم. خوب چاره و نکته در اینجاست که با انتخاب یک کتاب مفید در این زمینه می‌توان تا حدود زیادی این محدویت‌ها را برطرف کرد. در ادامه  برای شروع کار با NHibernate  که روز به روز در حال توسعه است، میتوان کتاب  زیر را شروع بسیار خوبی برای کار دانست: 

      NHibernate 3 Beginners Guide, Aug 2011 

      در این کتاب بصورتی بسیار جامع از ابتدایی‌ترین مسئله تا فنی‌ترین مسائلی که  در هر پروژه‌ی‌ عملی هر توسعه دهنده ای با هر سطحی امکان مواجه شدن با این مشکلات را دارد به تفصیل بررسی شده. این کتاب شامل 12 فصل بوده که مطالب آن به شرح زیر ارائه شده است:
      1- فصل اول – نگاه اولیه:
      • NHibernate چیست
      • موارد تازه در آخرین نسخه NHibernate
      • چرا ما استفاده کنیم و چه کسانی دیگری استفاده میکنند
      • زمانیکه به مشکل برخوردیم از کجا کمک بگیریم یا حتی نسخه ای تجاری تهیه کنیم
      2- فصل دوم – اولین مثال کامل:
      • آماده سازی سیستم برای توسعه برنامه‌ها با استفاده از NHibernate
      • ایجاد یک مدل ساده از مشکل موجود
      • ایجاد بانک و برپایی یک نگاشت (Map) بین مدل و بانک
      • نوشتن و خواندن داده از و به بانک
      • بحث در مورد بدست آوردن نتیجه معادل بدون استفاده از NHibernate و یا ORM دیگر
      3- فصل سوم - ایجاد یک مدل:
      • مدل چیست؟
      • عوامل اصلی موجود در ایجاد یک مدل چیست؟
      • چطور میتوان مدل ساخت؟
      4- فصل چهارم – ایجاد شمای بانک:
      • یادگیری جدول چیست؟
      • یادگیری چطور جدولها به هم مرتبط شود؟
      • بحث در مورد  استراتژی‌های تحمیلی ای که کدام داده میتواند ذخیره شود
      • نمایش امکانات موجود برای بهبود کارایی دسترسی به داده
      • ایجاد بانک داده برای سیستم سفارش (Ordering System)
      5- فصل پنجم - نگاشت مدل به بانک داده:
      • بدست آوردن یک درک درست درباره نگاشت و پیش نیازهای آن
      • بحث در مورد ریزه کاری‌های چهار تکنیک پر استفاده معمول نگاشت
      • توصیف و توسعه قراردادها برای کاهش تقلا در کدنویسی
      • ایجاد خودکار اسکریپت برای ایجاد شمای بانک دیتا از روی نگاشت مان
      • توصیف و نگاشت مدل دامنه سیستم سفارش مان
      6- فصل ششم – وهله‌ها و تراکنش ها
      • بحث در مورد اشیاء وهله و تراکنش
      • معرفی شیء session factory
      • پیاده سازی برنامه ای که دیتا ذخیره و بازخوانی میکند
      • تجزیه و تحلیل متدهای گوناگون برای مدیریت وهله‌ها در پر استفاده‌ترین انواع برنامه
      7- فصل هفتم - آزمایش کردن، نمایه سازی، نظارت، واقع نگاری
      • پیاده سازی یک بستر پایه برای ساخت آزمایش ساده کد دسترسی به بانک داده
      • ایجاد آزمایش‌ها برای تایید کد دسترسی به بانک داده مان
      • تجزیه و تحلیل ارتباط بین NHibernate و بانک داده
      • پیکربندی NHibernate برای واقع نگاری داده‌های مورد توجه
      8- فصل هشتم - پیکر بندی
      • بحث در مورد پیکربندی قبل از شروع
      • آشنا شدن با لیست مولفه‌های NHibernate که میتوان پیکربندی کرد
      • یادگیری چهار روش متفاوت پیکربندی که چگونه میتوان در برنامه هایمان استفاده کرد
      9- فصل نهم – نوشتن پرس و جو
      • یادگیری چگونگی استفاه از (LINQ (Language Integrated Query در NHibernate  برای دریافت داده
      • پرس و جو با استفاده از criteria query API
      • استفاده از گویش object-oriented اصلی SQL بنام Hibernate Query Language HQL
      • بحث در مورد موجودیت هایی با خواصی که توان lazy load دارند
      • مقابله با بارگذاری حریصانه با lazy loading بطوریکه بصورت دسته ای از پرس و جو بنظر آید
      10- فصل دهم – اعتبار سنجی داده برای نگهداری (ذخیره)
      11- فصل یازدهم – اشتباهات متداول – چیزهایی برای جلوگیری
       

       

       
      مطالب
      آزمایش Web APIs توسط Postman - قسمت هفتم - استفاده از خروجی OpenAPI Swagger در Postman
      در سری «OpenAPI Swagger» با نحوه‌ی مستندسازی یک Web API و همچنین آزمایش دستی اجزای آن به کمک Swagger-UI که رابط کاربری ایجاد شده‌ای بر اساس خروجی Open API است، آشنا شدیم. بنابراین اگر می‌توان رابط کاربری خودکاری را بر اساس OpenAPI Spec ایجاد کرد، به این معنا است که تمام اطلاعات لازم جهت انجام اینکار، هم اکنون در آن قرار دارد. در ادامه قصد داریم تعامل دستی با Swagger-UI را جهت آزمایش Web API، به Postman منتقل کرده تا اجرای مجموعه‌ای از آن‌ها را توسط Collection Runner، خودکار کنیم.


      ساخت و ایجاد درخواست‌های Postman به کمک خروجی OpenAPI

      در اینجا از همان برنامه‌ای که در سری «مستند سازی ASP.NET Core 2x API توسط OpenAPI Swagger» بررسی کردیم، استفاده خواهیم کرد. بنابراین، این برنامه از پیش تنظیم شده‌است و هم اکنون به همراه یک تولید کننده‌ی OpenAPI Specification نیز می‌باشد. آن‌را اجرا کنید تا بتوان به OpenAPI Specification تولیدی آن در آدرس زیر دسترسی یافت:
      https://localhost:5001/swagger/LibraryOpenAPISpecification/swagger.json
      سپس برنامه‌ی Postman را گشوده و از منوی File، گزینه‌ی Import آن‌را انتخاب کنید:


      در برگه‌ی Import from link آن، همان URL فوق را که به خروجی OpenAPI Spec اشاره می‌کند، وارد کنید. اکنون با کلیک بر روی دکمه‌ی Import، یک مجموعه‌ی جدید، به نام Library API، به لیست مجموعه‌های Postman، اضافه می‌شود:


      Postman تمام این اطلاعات را به صورت خودکار از OpenAPI Spec استخراج کرده‌است. تمام نام‌ها نیز بر اساس توضیحاتی که برای متدها نوشته‌ایم، انتخاب شده‌اند.


      ارسال اولین درخواست به Web API

      در اینجا برای نمونه اگر درخواست «Get list of authors» را انتخاب کنیم، یک چنین خروجی ظاهر می‌شود:


      همانطور که مشاهده می‌کنید، متغیر {{baseUrl}} را جهت تنظیم آدرس پایه‌ی Web API انتخاب کرده‌است. این نکته در مطلب «قسمت پنجم - انواع متغیرهای قابل تعریف در Postman» بیشتر بحث شده‌است. هدف از تعریف متغیر {{baseUrl}} به این شکل در اینجا، امکان تعریف آن به صورت یک متغیر محیطی است تا بتوان آن‌را به سادگی بر اساس محیط‌های مختلفی که تعریف و انتخاب می‌کنیم، تغییر داد؛ بدون اینکه نیازی باشد اصل درخواست‌های تعریف شده، تغییری کنند. بنابراین در ادامه نیاز است یک محیط جدید را تعریف کنیم.
      برای تعریف یک محیط جدید می‌توان بر روی دکمه‌‌ای با آیکن چشم، در بالای سمت راست صفحه و کلیک بر روی گزینه‌ی Add آن، یک محیط جدید را ایجاد کرد:


      در صفحه‌ی باز شده ابتدا باید نامی را برای این محیط جدید انتخاب کرد و سپس می‌توان key/valueهایی را مخصوص این محیط، تعریف نمود:


      ابتدا یک نام دلخواه وارد شده‌است و سپس متغیر محیطی baseUrl را با مقدار اولیه‌ی https://localhost:5001 تنظیم کرده‌ایم. پس از آن با کلیک بر روی Add پایین این صفحه، کار تعریف این محیط جدید به پایان می‌رسد.

      مرحله‌ی بعد، انتخاب این محیط تعریف شده، به عنوان محیط کاری جاری است:


      پس از این انتخاب، اگر اشاره‌گر ماوس را به متغیر baseUrl نزدیک کنیم، می‌توان مقدار تنظیم شده‌ی آن‌را مشاهده کرد:


      اکنون اگر بر روی دکمه‌ی send این درخواست کلیک کنیم، چنین خروجی ظاهر می‌شود:


      علت آن‌را می‌توان در برگه‌ی Authorization درخواست جاری مشاهده کرد:


      همانطور که در مطلب «قسمت ششم - یک مثال تکمیلی: تبدیل رابط کاربری مثال JWT به یک مجموعه‌ی Postman» نیز مشاهده کردیم، برای تعریف هدرهای Authorization یا می‌توان به برگه‌ی هدرهای درخواست جاری مراجعه کرد و این هدرها را دستی تولید کرد و یا می‌توان با استفاده از برگه‌ی Authorization آن، کار تعریف این هدرها را ساده نمود. برای مثال در اینجا Postman بر اساس خروجی OpenAPI، دقیقا تشخیص داده‌است که این Web API از Basic authentication استفاده می‌کند. به همین جهت فیلدهای ورود نام کاربری و کلمه‌ی عبور را علاوه بر نوع اعتبارسنجی از پیش انتخاب شده، تدارک دیده‌است.
      برای اینکه این مقادیر را نیز تبدیل به متغیرهای محیطی کنیم، برای ویرایش اطلاعات منتسب به محیط جاری، ابتدا باید آن‌را از dropdown محیط‌های بالای صفحه انتخاب کرد. اکنون با کلیک بر روی دکمه‌‌ای با آیکن چشم، در بالای سمت راست صفحه، لینک ویرایش این محیط انتخاب شده ظاهر می‌شود. با کلیک بر روی آن، می‌توان دو متغیر محیطی جدید را تعریف کرد:


      پس از تعریف متغیرهای محیطی {{username}} و {{password}}، آن‌ها را در قسمت Authorization درخواست جاری استفاده می‌کنیم:


      اینبار اگر مجددا بر روی دکمه‌ی Send کلیک کنیم، خروجی ذیل حاصل خواهد شد:


       
      مطالب
      مهارت‌های تزریق وابستگی‌ها در برنامه‌های NET Core. - قسمت دهم - پیاده سازی الگوی Decorator
      الگوی decorator، امکان محصور کردن یک شیء مفروض را با لایه‌ای بر فراز آن میسر می‌کند. برای مثال بجای اینکه در تمام متدهای سرویسی از try/catch استفاده کنیم، می‌توانیم این متدها را با یک ExceptionHandlingDecorator مزین کنیم و یا از این دست اعمال تکراری می‌توان به لاگ کردن ورودی و خروجی‌های یک متد و یا کش کردن اطلاعات آن‌ها نیز اشاره کرد. حتی عملیاتی مانند تشخیص خواص تغییر یافته‌ی یک شیء در Entity framework نیز به کمک همین مزین کننده‌ها که شیء اصلی در حال استفاده را با ایجاد لایه‌ای بر روی آن‌ها محصور می‌کنند، انجام می‌شود. به این عملیات Aspect oriented programming و یا AOP نیز می‌گویند؛ در اینجا واژه‌ی Aspect به اعمال مشترک و متداول موجود در برنامه اشاره می‌کند. در این مطلب قصد داریم نمونه‌ای از این تزئین کننده‌ها را به کمک سیستم تزریق وابستگی‌های NET Core. پیاده سازی کنیم.


      پیاده سازی الگوی Decorator به کمک سیستم تزریق وابستگی‌های NET Core.

      مثال زیر را در نظر بگیرید که در آن یک سرویس تعریف شده‌است و در این بین استثنائی رخ داده‌است.
          public interface ITaskService
          {
              void Run();
          }
      
          public class MyTaskService : ITaskService
          {
              public void Run()
              {
                  throw new InvalidOperationException("An exception from the MyTaskService!");
              }
          }
      می‌خواهیم بدون تغییری در کدهای این کلاس، به متدهای آن در حین اجرای نهایی، یک try/catch را به همراه logging، اضافه کنیم. به همین جهت نیاز خواهیم داشت تا یک محصور کننده (تزئین کننده یا decorator در اینجا) را برای آن طراحی کنیم:
      using System;
      using Microsoft.Extensions.Logging;
      namespace CoreIocServices
      {
          public class MyTaskServiceDecorator : ITaskService
          {
              private readonly ILogger<MyTaskServiceDecorator> _logger;
              private readonly ITaskService _decorated;
      
              public MyTaskServiceDecorator(
                  ILogger<MyTaskServiceDecorator> logger,
                  ITaskService decorated)
              {
                  _logger = logger;
                  _decorated = decorated;
              }
      
              public void Run()
              {
                  try
                  {
                      _decorated.Run();
                  }
                  catch (Exception ex)
                  {
                      _logger.LogCritical(ex, "An unhandled exception has been occurred.");
                  }
              }
          }
      }
      این محصور کننده نیز دقیقا همان ITaskService را پیاده سازی می‌کند؛ اما در سازنده‌ی آن یک ITaskService را نیز دریافت می‌کند. علت اینجا است که توسط آن بتوان متدهای ITaskService تزریقی را اجرا کرد و بر روی آن اعمالی مانند کش کردن، لاگ کردن و مدیریت استثناءها و غیره را انجام داد. برای مثال در متد Run آن مشاهده می‌کنید که متد Run همان وهله‌ی تزریقی اجرا شده‌است؛ اما درون یک try/catch به همراه لاگ کردن جزئیات استثنای رخ داده.
      مزیت این‌کار، پیاده سازی اصل DRY یا Don't repeat yourself است. کاری که برای رفع این مشکل قرار است انجام دهیم، استفاده از یک تزئین کننده (محصور کننده)، کپسوله سازی اعمال تکراری و سپس اتصال آن به قسمت‌های مختلف برنامه است. همچنین در این حالت اصل open closed principle نیز بهتر رعایت خواهد شد. از این جهت که کدهای تکراری برنامه به یک لایه‌ی دیگر منتقل شده‌اند و دیگر نیازی نیست برای تغییر آن‌ها، کدهای قسمت‌های اصلی برنامه را تغییر داد (کدهای برنامه باز خواهند بود برای توسعه و بسته برای تغییر).

      پس از طراحی این تزئین کننده، اکنون نوبت به معرفی آن به سیستم تزریق وابستگی‌های NET Core. است:
      namespace CoreIocSample02
      {
          public class Startup
          {
              public void ConfigureServices(IServiceCollection services)
              {
                  services.AddTransient<MyTaskService>();
                  services.AddTransient<ITaskService>(serviceProvider =>
                      new MyTaskServiceDecorator(
                           serviceProvider.GetService<ILogger<MyTaskServiceDecorator>>(),
                           serviceProvider.GetService<MyTaskService>())
                  );
      روش انجام اینکار را نیز در «قسمت ششم - دخالت در مراحل وهله سازی اشیاء توسط IoC Container» بیشتر بررسی کرده‌ایم.
      در اینجا هم می‌توان در صورت نیاز اصل کلاس MyTaskService را بدون هیچ نوع تزئین کننده‌ای از سیستم تزریق وابستگی‌ها دریافت کرد و یا اگر وهله‌ای از سرویس ITaskService را از آن درخواست کردیم، ابتدا شیء MyTaskServiceDecorator وهله سازی شده و سپس توسط آن یک نمونه‌ی محصور شده و تزئین شده‌ی MyTaskService به فراخوان بازگشت داده خواهد شد.


      ساده سازی معرفی تزئین کننده‌ها به سیستم تزریق وابستگی‌های NET Core. به کمک Scrutor

      در «قسمت هشتم - ساده سازی معرفی سرویس‌ها توسط Scrutor» با کتابخانه‌ی Scrutor آشنا شدیم. یکی دیگر از قابلیت‌های آن، امکان ساده سازی تعریف تزئین کنند‌ها است:
      namespace CoreIocSample02
      {
          public class Startup
          {
              public void ConfigureServices(IServiceCollection services)
              {
                  services.AddTransient<ITaskService, MyTaskService>();
                  services.Decorate<ITaskService, MyTaskServiceDecorator>();
      در اینجا معادل کدهایی را که با روش factory خود NET Core. نوشتیم، ملاحظه می‌کنید. ابتدا نیاز است خود سرویس اصلی غیر تزئین شده، به نحو متداولی به سیستم معرفی شود. سپس متد الحاقی جدید <,>Decorate را با همان اینترفیس و اینبار با Decorator مدنظر معرفی می‌کنیم. کاری که Scrutor در اینجا انجام می‌دهد، یافتن سرویس ITaskService معرفی شده‌ی پیشین و تعویض آن با MyTaskServiceDecorator می‌باشد. بنابراین نیاز است تعریف services.AddTransient پیش از تعریف services.Decorate انجام شده باشد. این روش تمیزتر از روش قبلی به نظر می‌رسد و شامل وهله سازی مستقیم MyTaskServiceDecorator به همراه فراهم آوردن تمام پارامترهای سازنده‌ی آن توسط ما نیست.