نظرات مطالب
آزمایش Web APIs توسط Postman - قسمت ششم - اعتبارسنجی مبتنی بر JWT
- یک نمونه مثال کامل کنسول «ASPNETCore Jwt Authentication.ConsoleClient» که کوکی‌های آنتی‌فورجری پس از لاگین را دریافت و پردازش می‌کند؛ مرتبط با پروژه‌ی مطلب «اعتبارسنجی مبتنی بر JWT در ASP.NET Core 2.0 بدون استفاده از سیستم Identity» که در بحث جاری به آن پرداخته شد. مثال Ajax ای آن هم در همان پروژه موجود است.
- اگر «مستند سازی ASP.NET Core 2x API توسط OpenAPI Swagger» را پیاده سازی کنید و مباحث «تکمیل مستندات محافظت از API» را لحاظ کنید، با استفاده از ابزارهایی می‌توانید « تولید خودکار کدهای سمت کلاینت» را هم انجام دهید.
اشتراک‌ها
توسعه مدل Asp.Net Identity 2.0

در این مقاله به توسعه Asp.net Identity Model 2.0 برای پیاده سازی مدل Group Based Permission با کلید اصلی Int خواهم پرداخت و همچنین ذکر نکات جانبی برای بهینه کردن مدل.

توسعه مدل Asp.Net Identity 2.0
مطالب
بررسی Bad code smell ها: فیلدهای موقتی
فیلد موقتی یا Temporary field در دسته بندی الگوهای «بد استفاده کنندگان از شیء گرایی» قرار می‌گیرد. در این الگوی بد، فیلدها یا خصوصیات یک کلاس، در شرایط خاصی مقدار گرفته و مورد استفاده قرار می‌گیرند و در بقیه شرایط خالی هستند. 
زمانیکه در یک کلاس، متدی برای انجام فعالیت خود، تعدادی پارامتر ورودی زیادی نیاز داشته باشد، ممکن است برنامه نویس برای مواجه نشدن با تعداد پارامترهای زیاد ورودی، فیلدها یا خصوصیاتی را در کلاس مربوط به آن متد ایجاد کند. این فیلدها عملا فقط زمان صدا زدن آن متد مقدار گرفته و در بقیه شرایط خالی هستند.
خواندن و استفاده از این نوع کدها معمولا مشکل و چالش برانگیز است. زیرا خواننده شاهد فیلدهایی است که در اکثر مواقع خالی هستند. همچنین زمان استفاده از این کلاس نمی‌توان از وجود مقادیر فیلدها یا خصوصیات آن‌ها اطمینان لازم را داشت.

روش‌های اصلاح این کد بد بو 

برای اصلاح چنین بوی بدی به طور معمول دو راه وجود دارد. 
اول: با در نظر گرفتن اینکه تمامی کد موجود در متد و فیلدهای مرتبط به آن قابلیت انتقال به کلاس خاص خودشان را دارند، می‌تواند کلاس مجزایی را برای آن متد و فیلدهای مربوطه ایجاد کرد. 
دوم: برای فیلدها و خصوصیاتی که در خیلی مواقع خالی هستند، می‌توان با روش Null object برای وضعیت خالی بودن آن، یک شیء خالی بی اثر را ایجاد کرد.  
به مثال زیر توجه کنید: 
فرض کنید در حال تولید سیستمی هستید که در روال خاصی، نیاز به محاسبه پورسانت فروشنده‌ها دارید. برای محاسبه پورسانت به موارد زیر نیاز است:
  • لیست محصولات فروخته شده
  • درصد کمیسیون خام
  • تاریخ فروش
  • شعبه فروش
  • نوع پرداخت 
به طور نمونه اگر فروشنده فروش نقدی ای انجام دهد، کمیسیون بیشتری نسبت به کمیسیون پیشفرض، به او تعلق خواهد گرفت و … 
ممکن است طراحی اولیه برای چنین متدی به صورت زیر باشد: 
public class Salesman 
{ 
    public void Method1() 
    { 
       return; 
    } 
    public void Method2() 
    { 
        return; 
    } 
    public void Method3() 
    { 
       return; 
    }
    public decimal CalculateCommission(dynamic products, dynamic commissionRate, dynamic saleDate, dynamic branch, dynamic paymentType) 
    { 
       return decimal.MaxValue; 
    } 
}
با مشاهده پارامتر‌های زیاد متد، برنامه نویس می‌تواند از روش‌های اصلاح بوی بد «تعداد زیاد پارامترهای ورودی» استفاده کند. یا اینکه برنامه نویس برای خلاصی از این کد بد بو، بجای ارسال پارامتر، فیلدهایی را در کلاس Salesman ایجاد کند؛ مانند کد زیر:  
public class SalesmanV2 
{ 
    public IEnumerable<dynamic> Products { get; set; } 
    public dynamic CommisionRate { get; set; } 
    public dynamic SaleDate { get; set; } 
    public dynamic Branch { get; set; } 
    public dynamic PaymentType { get; set; } 
    public void Method1() 
    { 
        return; 
    } 
    public void Method2() 
    { 
        return; 
    } 
    public void Method3() 
    { 
        return; 
    } 
    public decimal CalculateCommission() 
    { 
       return decimal.MaxValue; 
    } 
}
با این تغییر، پارامترهای متد CalculateCommision به خصوصیاتی در کلاس Salesman تبدیل خواهند شد. دقت کنید این کلاس متدهای دیگری برای فعالیت‌های مختلف دارد.  
در روش‌های اصلاح این کد بد بو، اشاره به انتقال منطق متد مذکور به کلاس مجزا و مخصوص به خود شده بود. در واقع کد بد بوی «فیلد موقتی» ناشی از عدم رعایت اصل single responsibility است و محاسبه پورسانت را از نظر ذاتی می‌توان وظیفه‌ی اضافه‌ای در این کلاس دانست. با توجه به اینکه می‌توان محاسبه پورسانت را به صورت جداگانه پیاده سازی کرد. به چنین پیاده سازی ای خواهیم رسید.  
public class SalesmanV3 
{ 
    public void Method1() 
    { 
        return; 
    } 
    public void Method2() 
    { 
        return; 
    } 
    public void Method3() 
    { 
        return; 
    } 
} 

public class CommissionCalculator 
{ 
    private IEnumerable<dynamic> _products; 
    private dynamic _commisionRate; 
    private dynamic _saleDate; 
    private dynamic _branch; 
    private dynamic _paymentType; 
    public CommissionCalculator(IEnumerable<dynamic> products, dynamic commisionRate, 
            dynamic saleDate, dynamic branch, dynamic paymentType) 
    { 
        _products = products; 
        _commisionRate = commisionRate; 
        _saleDate = saleDate; 
        _branch = branch; 
        _paymentType = paymentType; 
    } 
}
در شرایط نادری، کد بد بوی «فیلد موقتی» ناشی از عدم رعایت اصل single responsibility نیست. در چنین شرایطی می‌توان از null object برای رفع این بوی بد استفاده کرد.

جمع بندی 

همان‌طور که در متن نیز اشاره شد، عدم رعایت اصل single responsibility می‌تواند منجر به چنین کد بد بویی شود. این کد بد بو با روش‌های ساده‌ای قابل اصلاح است. اصلاح چنین بویی خوانایی و قابلیت نگهداری کد را افزایش خواهد داد. 
اشتراک‌ها
اعتبارسنجی در ASP.Net MVC با استفاده از کتابخانه jQuery

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

اعتبارسنجی در ASP.Net MVC با استفاده از کتابخانه jQuery
نظرات مطالب
Embed کردن SQL Server Express 2008 در یک برنامه
میشه لطفا روشی را برای نصب خودکار بانک اطلاعاتی بهنگام نصب برنامه‌ی اصلی معرفی نمایید.
چون در روال عادی برنامه‌های دات نت این کار باید به صورت دستی انجام بشه.
نظرات مطالب
درج یک باره چندین رکورد بصورت همزمان هنگام استفاده از ORMها
برای رفع مشکل دوم میتونید از DataTable استفاده کنید و نام خاصیتی که ستون متناظرش در جدول فرق داره رو هنگام تعریف DataColumn عوض کنید. روال کار همینه فقط اضافه کاری داره.
نظرات مطالب
بالا بردن سرعت بارگذاری اولیه EF Code first با تعداد مدل‌های زیاد
بله. همین روال رو می‌تونید توسط افزونه «Entity Framework Power Tools» هم انجام بدید (گزینه Generate Views را به منوی کلیک راست بر روی Entity Data Model/*.EDMX اضافه می‌کند).
نظرات مطالب
فشرده سازی خروجی فایلهای استاتیک سایت
- خیر.
- من دسترسی به سرور و کدهای شما برای دیباگ ندارم. از ELMAH استفاده کنید. شاید خطایی در کار باشد که با ELMAH لاگ می‌شود. شاید اصلا این روال فراخوانی نمی‌شود که بهتر است این نوع کدها را به یک http module منتقل کرد و نه اینکه مستقیما داخل global.asax.cs نوشت.
نظرات مطالب
EF Code First #2
در برنامه‌های وب، قسمت Database.SetInitializer باید در روال Application_Start فایل Global.asax.cs اضافه شود. ضمن اینکه مکان تعریف رشته اتصالی به بانک اطلاعاتی اینبار فایل web.config خواهد بود.
پاسخ به بازخورد‌های پروژه‌ها
چگونگی ایجاد گزارش بدون اینکه تداخل داده به وجود آید
سلام؛
یک مثال جدید جهت تولید فایل‌های PDF در حافظه و سپس flush آن به درون مرورگر کاربر اضافه کردم: (^)
دو نکته آن جدید است:
الف) سطر data.AsPdfStream
ب) نحوه فلاش فایل حاصل در روال رخدادگردان events.DocumentClosing