‫۷ سال و ۱۲ ماه قبل، چهارشنبه ۱۴ مهر ۱۳۹۵، ساعت ۱۳:۰۷
یک نکته: طراحی کانفیگ برای یک کتابخانه
فرض کنید قصد دارید برای کتابخانه‌ای که در حال طراحی هستید، تنظیماتی را از استفاده کننده دریافت کنید؛ مثلا از طریق کلاسی شبیه به تعریف SmtpConfig مطلب فوق.
برای اینکار، ابتدا یک متد الحاقی را تعریف می‌کنیم که IServiceCollection را به همراه SmtpConfig دریافت کند:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
 
namespace SampleLib
{
  public static class MyServiceCollectionExtensions
  {
   public static void AddMySampleLib(this IServiceCollection services, SmtpConfig configureOptions)
   {
    services.TryAddSingleton(Options.Create(configureOptions));
   }
  }
}
سپس کار معرفی این کلاس تنظیمات به سیستم IOptions ، از طریق ثبت سرویس آن توسط متد Options.Create صورت می‌گیرد.
استفاده کنند، تنها نیاز دارد تا این تنظیمات را به صورت ذیل در کلاس آغازین برنامه وارد کند:
public void ConfigureServices(IServiceCollection services)
{
   services.AddMySampleLib(new SmtpConfig { /*...*/ });
و در آخر در کدهای کتابخانه‌ی در حال طراحی، با تزریق <IOptions<SmtpConfig به سازنده‌ی کلاس‌ها، می‌توان به تنظیمات ثبت شده، دسترسی پیدا کرد.
‫۷ سال و ۱۲ ماه قبل، چهارشنبه ۱۴ مهر ۱۳۹۵، ساعت ۱۲:۰۶
- زمانیکه یک DLL قابل بارگذاری نیست یعنی یکسری از وابستگی‌های آن نصب نشدند. این لیست را هم باید نصب کنید:
Windows dependencies 
- وابستگی ویندوز سرور آن علاوه بر نصب NET Core.، نصب Visual C++ Redistributable for Visual Studio 2015 است. بسته‌ای را که در اینجا لینک دادند، قدیمی است. آدرس بسته‌ی به روز و جدید آن (با شماره نگارش 14.0.24215 ^) 
‫۷ سال و ۱۲ ماه قبل، دوشنبه ۱۲ مهر ۱۳۹۵، ساعت ۲۲:۴۴
یک نکته: برای تبدیل محتوای یک TagBuilder به رشته می‌توان از متد زیر استفاده کرد:
using System.IO;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Html;

namespace Sample
{
    /// <summary>
    /// Html Helper Extensions
    /// </summary>
    public static class HtmlHelperExtensions
    {
        /// <summary>
        /// Convert IHtmlContent/TagBuilder to string
        /// </summary>
        public static string GetString(this IHtmlContent content)
        {
            using (var writer = new StringWriter())
            {
                content.WriteTo(writer, HtmlEncoder.Default);
                return writer.ToString();
            }
        }
    }
}
‫۷ سال و ۱۲ ماه قبل، یکشنبه ۱۱ مهر ۱۳۹۵، ساعت ۲۳:۲۵
ابتدا مطمئن شوید که در فایل web.config چنین تنظیمی را دارید (برای پردازش مسیرهای نقطه دار، ضروری است):
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" >
سپس این مسیریابی را تعریف کنید (پیش از مسیریابی پیش فرض یا default خود ASP.NET MVC):
 routes.MapRoute(
                name: "joomla",
                url: "fa/index.php",
                defaults: new { controller = "Joomla", action = "Index" }
            );
این مسیریابی، تمام آدرس‌های شروع شده‌ی با fa/index.php را به کنترلری به نام Joomla و اکشن متد Index آن ارسال می‌کند. نیازی نیست تا کوئری استرینگ‌ها را در اینجا ذکر کرد. چون به صورت خودکار به پارامترهایی همنام، نگاشت خواهند شد:
using System.Web.Mvc;

namespace MVC5Basic.Controllers
{
    public class JoomlaController : Controller
    {
        public ActionResult Index(string option, string view, string id, string itemid)
        {
            //todo: process parameters and then return something!
            return View();
        }
    }
}
شکل نهایی کنترلر Joomla به صورت فوق است. در اینجا تمام کوئری استرینگ‌ها، تبدیل به یک پارامتر متناظر در اکشن متد Index شدند.
در این حالت اگر برای مثال همان آدرسی را که عنوان کردید، درخواست شود:


به صورت خودکار به این کنترلر جدید هدایت می‌شود؛ به همراه مقادیر تمام پارامترهای آن:

‫۷ سال و ۱۲ ماه قبل، یکشنبه ۱۱ مهر ۱۳۹۵، ساعت ۱۵:۲۷
یک نکته: دسترسی به سرویس‌ها، زمانیکه امکان استفاده‌ی از HttpContext وجود دارد (روش Service locator):
using Microsoft.Extensions.DependencyInjection;
//...
var studentOperations = Request.HttpContext.RequestServices.GetService<IStudentOperations>();
‫۷ سال و ۱۲ ماه قبل، شنبه ۱۰ مهر ۱۳۹۵، ساعت ۱۷:۳۵
«آیا کش پروسیجر هم خالی می‌شود.»
خیر. هرچیزی که جزئیات آن تحت نظر Context نباشد، this.ChangeTracker از وجود آن‌ها بی‌اطلاع است. همچنین هر کوئری که جزئیات آن تحت نظر Context نباشد، محاسبه‌ی وابستگی‌های آن ممکن نیست. در یک چنین حالتی فقط می‌توانید کل کش را وادار به روز رسانی کنید.
‫۷ سال و ۱۲ ماه قبل، جمعه ۹ مهر ۱۳۹۵، ساعت ۱۴:۲۳
یک نکته‌ی تکمیلی
روش تزریق وابستگی‌های عنوان شده‌ی برای ویژگی‌ها (attributes)، در مورد ValidationAttribute کمی متفاوت است و باید به صورت زیر باشد:
public class CustomValidationAttribute : ValidationAttribute   
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
        var service = validationContext.GetService(typeof(IExternalService)); 
        // use service 
    } 
}