مطالب
ارتقاء به ASP.NET Core 1.0 - قسمت 21 - بررسی تغییرات Bundling و Minification
زیرساخت یکی کردن و فشرده سازی اسکریپت‌ها و فایل‌های CSS نگارش پیشین ASP.NET MVC، به طور کامل از ASP.NET Core حذف شده‌است. در ابتدا (تا نگارش RC2)، روش استفاده‌ی از Gulp را توصیه کردند و در زمان ارائه‌ی نگارش RTM، توصیه‌ی رسمی آن‌ها به Bundler Minifier تغییر کرد (و دیگر Gulp را توصیه نمی‌کنند).


یکی کردن و فشرده سازی فایل‌های استاتیک در ASP.NET Core

هدف از یکی کردن و فشرده سازی فایل‌های استاتیک مانند اسکریپت‌ها و فایل‌های CSS، بهبود کارآیی برنامه با کاهش حجم نهایی ارائه‌ی آن و همچنین کاهش تعداد رفت و برگشت‌های به سرور برای دریافت فایل‌های متعدد مرتبط به آن است. در عملیات Bundling، چندین فایل، به یک تک فایل تبدیل می‌شوند تا اتصالات مرورگر به وب سرور، جهت دریافت آن‌ها به نحو چشمگیری کاهش پیدا کند و در عملیات Minification، مراحل متعددی بر روی کدهای نوشته شده صورت می‌گیرد تا حجم نهایی آن‌ها کاهش پیدا کنند. مایکروسافت در ASP.NET Core RTM، ابزاری را به نام BundlerMinifier.Core جهت برآورده کردن این اهداف ارائه کرده‌است. بنابراین اولین قدم، نصب وابستگی‌های آن است.
برای اینکار یک سطر ذیل  را به فایل project.json اضافه کنید. این بسته باید به قسمت tools اضافه شود تا قابلیت فراخوانی از طریق خط فرمان را نیز پیدا کند:
"tools": {
    "BundlerMinifier.Core": "2.1.258"
},
در غیر اینصورت (ذکر آن در قسمت dependencies) خطاهای ذیل را دریافت خواهید کرد:
No executable found matching command "dotnet-bundle"
Version for package `BundlerMinifier.Core` could not be resolved.


اسکریپت نویسی برای کار با BundlerMinifier.Core

روش‌های زیادی برای کار با ابزار BundlerMinifier.Core وجود دارند؛ منجمله انتخاب فایل‌ها در solution explorer و سپس کلیک راست بر روی فایل‌های انتخاب شده و انتخاب گزینه‌ی bundler & minifier برای یکی کردن و فشرده سازی خودکار این فایل‌ها. برای این منظور افزونه‌ی Bundler & Minifier را نیاز است نصب کنید.
اما روشی که قابلیت خودکارسازی را دارد، استفاده از فایل ویژه‌ی bundleconfig.json این ابزار است. برای این منظور فایل جدید bundleconfig.json را به ریشه‌ی پروژه اضافه کرده و سپس محتوای ذیل را به آن اضافه کنید:
[
    {
        "outputFileName": "wwwroot/css/site.min.css",
        "inputFiles": [
            "wwwroot/css/site.css"
        ]
    },
    {
        "outputFileName": "wwwroot/js/site.min.js",
        "inputFiles": [
            "bower_components/jquery/dist/jquery.min.js",
            "bower_components/jquery-validation/dist/jquery.validate.min.js",
            "bower_components/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
        ],
        "minify": {
            "enabled": true,
            "renameLocals": true
        },
        "sourceMap": false
    }
]
فرمت این فایل بسیار خوانا است. برای مثال در یک مدخل آن، در ذیل خاصیت inputFiles، لیست فایل‌های css ذکر می‌شوند و سپس در outputFileName، محل نهایی فایل تولیدی باید ذکر شود. این محل نیز باید از پیش وجود داشته باشد. یعنی باید پوشه‌های js و css را در پوشه‌ی عمومی wwwroot پیشتر ایجاد کرده باشید.
با ذخیره سازی این فایل، کار یکی سازی و فشرده کردن مداخل آن به صورت خودکار صورت خواهد گرفت.


خودکار سازی فرآیند یکی کردن و فشرده سازی فایل‌های استاتیک

برای خودکار سازی این فرآیند، می‌توان به صورت زیر عمل کرد. فایل project.json را گشوده و قسمت scripts آن‌را به نحو ذیل تغییر دهید:
"scripts": {
    "precompile": [
        "dotnet bundle"
    ],
    "prepublish": [
        "bower install"
    ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
روش دستی کار با ابزار BundlerMinifier، مراجعه به خط فرمان و صدور دستور dotnet bundle است (ابتدا از طریق خط فرمان به ریشه‌ی پروژه وارد شده و سپس این دستور را صادر کنید). برای خودکار سازی آن می‌توان این دستور را در قسمت scripts فایل project.json نیز ذکر کرد تا پیش از کامپایل برنامه، کار یکی کردن، فشرده سازی و همچنین کپی فایل نهایی به پوشه‌ی wwwroot برنامه به صورت خودکار انجام شود.

یک نکته: به منوی Build گزینه‌ی Update all bundles نیز با نصب افزونه‌ی Bundler & Minifier اضافه می‌شود. همچنین اگر از منوی Tools گزینه‌ی Task runner explorer را انتخاب کنید، فایل bundleconfig.json توسط آن شناسایی شده و گزینه‌ی update all files را نیز در اینجا مشاهده خواهید کرد.



ساده سازی تعاریف فایل Layout برنامه

در یک چنین حالتی دیگر نباید در فایل layout شما، ارجاعات مستقیمی به پوشه‌ی مثلا bower_components وجود داشته باشند و یا در کلاس آغازین برنامه، نیازی نیست تا این پوشه را عمومی کنید. لیست مداخلی را که نیاز دارید، به ترتیب از پوشه‌های مختلفی تهیه و در فایل bundleconfig.json ذکر کنید تا یکی شده و خروجی js/site.min.js را تشکیل دهند. این مورد تنها مدخلی است که نیاز است در فایل layout برنامه ذکر شود (بجای چندین و چند مدخل مورد نیاز):
 <script src="~/js/site.min.js" asp-append-version="true" type="text/javascript"></script>
در مورد ویژگی asp-append-version نیز پیشتر در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 12 - معرفی Tag Helpers» بحث شد و به آن مکانیزم cache busting می‌گویند. این ویژگی سبب خواهد شد تا یک کوئری استرینگ v=xyz? مانند، به انتهای آدرس اسکریپت یا فایل css یا هر فایل استاتیک دیگری اضافه شود. با تغییر محتوای این فایل، قسمت xyz به صورت خودکار تغییر خواهد کرد و به این ترتیب مرورگر همواره آخرین نگارش این فایل را دریافت می‌کند.
اشتراک‌ها
شرکت در وبینار شرکت تلریک

 شرکت تلریک برای دوم سپتامبر در ساعت 7:30 دقیقه بعد از ظهر به وقت ایران وبیناری را ارائه میکند که از همین الان میتوانید در آن ثبت نام کنید. موضوع وبینار در مورد محصول test studio جهت بررسی و برطرف کردن مشکلات Kendo UI در حین کار است. مدرس این وبینار آقای جاش بریستو یکی از مدیران تلریک در استرالیا و یکی از مدیران سابق شرکت مایکروسافت است.

شرکت در وبینار  شرکت تلریک
نظرات مطالب
ساخت یک گزارش ساز به کمک iTextSharp و Open Office
باتشکر،مقاله بسیار مفیدی هست و به کمک اون میشه گزارش‌های کاملا سفارشی و غیر جدولی ایجاد کرد ، اما نکته ای که در حین کار بهش برخوردم این بود که مقادیری عددی به همراه پسوند ریال شبیه شکل زیر در pdf نهایی تولید می‌شود  :

در صورتی که همین مقدار در داخل یک div و یا td در صفحه Razor بدرستی نمایش داده می‌شود 

در صورت امکان راهنمائی کنید.سپاس

نظرات مطالب
تنظیمات CORS در ASP.NET Core
یک نکته‌ی تکمیلی: چگونه در حین توسعه، بررسی CORS را در مرورگر کروم غیرفعال کنیم؟
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security  --user-data-dir=~/chromeTemp
اگر کروم با پرچم disable-web-security-- اجرا شود، دیگر کار بررسی CORS را انجام نمی‌دهد.
نظرات مطالب
C# 7 - Out variables
یک نکته‌ی تکمیلی: صرفنظر کردن از مقدار out
در C# 7 اگر مقدار خروجی حاصل از out مهم نبود، می‌توان آن‌را با _ جایگزین کرد:
var intString = "123";
if (int.TryParse(intString, out _))
{
    // it's integer
}
در این مثال برای ما فقط تشخیص عدد صحیح بودن رشته‌ی دریافتی مهم است و نه مقدار بازگشت داده شده‌ی توسط out. به همین جهت آن‌را با _ مشخص کرده‌ایم.
البته کامپایلر در پشت صحنه کار تعریف یک متغیر را در اینجا انجام خواهد داد؛ اما در حین کدنویسی نیازی به ذکر آن نیست.
نظرات مطالب
آشنایی با فریمورک الکترون Electron
خیر. الکترون فقط نیاز به یک ویرایشگر داره که اتفاقا به نظر ویژوال استادیو در این زمینه خیلی هم بهتر از اتم هست ولی سبک بودن اتم و مدیریت دایرکتوریش کمی دلچسب‌تر است وگرنه حین کار فایل package.json متوجه intellisense هوشمند هم شدم که خیلی راحت لیست کلمات کلیدی رو میاورد. visual studio code هم در این زمینه فوق العادست و خیلی راحت می‌توانید با دستور زیر آن را جای اتم صدا بزنید:
vscode .


نظرات مطالب
ASP.NET MVC #4
RouteTable.Routes یک شیء با طول عمر singleton است (پارامتر ورودی متد RegisterRoutes در مطلب فوق که در فایل global.asax.cs مقدار دهی می‌شود). یک وهله از آن در طول عمر برنامه با تمام اجزای آن وجود دارد. هر جزئی که اطلاعاتی را به RouteTable.Routes اضافه کند، توسط کل سیستم در حین آغاز به کار اولیه آن خوانده شده و استفاده خواهد شد. نمونه این مورد در مفهومی به نام Area در خود ASP.NET MVC استفاده می‌شود. هر Area دارای تنظیمات روت خاص خودش است که یکبار در آغاز برنامه خوانده شده و مورد استفاده قرار می‌گیرد.
نظرات مطالب
مروری بر کاربردهای Action و Func - قسمت سوم
گاهی از اوقات حین کار با نوع‌های جنریک نیاز دارید که مثلا null بازگشت بدید. در این حالت کامپایلر شما را با خطای Cannot convert null to type parameter T متوقف می‌کند. به همین جهت مرسوم است در این حالت از default T استفاده شود که مقدار پیش فرض نوع را برمی‌گرداند. اگر reference type باشد (مثل کلاس‌ها) این مقدار پیش فرض null خواهد بود؛ اگر value type باشد مانند int صفر بازگشت داده می‌شود.
نظرات مطالب
نرمال سازی (قسمت سوم: Third Normal Form)

یک نکته‌ای رو چند وقت قبل حین کار با ef بهش برخوردم که جالب بود. از دید ef ، کلیدخارجی یا کلید اصلی «فقط خواندنی» هستند. یعنی اگر در اینجا کسی بخواد نام رشته رو تغییر بده مشکل ساز خواهد شد.

به دو دلیل:

- استفاده از رشته‌ها نسبت به یک عدد چون طولانی‌تر هستند کندتر است برای حالت تعریف کلید

- اگر تغییری قرار است رخ دهد، باید به تمام جداول اعمال شود. (تعریف اطلاعات تکراری)

نظرات مطالب
Implementing second level caching in EF code first
احتمال داره در حین نمایش گرید، lazy loading فعال است و به این ترتیب بدون اینکه متوجه باشید چند صد کوئری مجدد به بانک اطلاعاتی ارسال می‌شود. در این حالت کار نمایش بسیار کند خواهد بود. این مساله رو فقط با یک پروفایلر می‌شود تشخیص داد؛ که روش آن در مقاله ذکر شده قسمت 10 بررسی شده. همچنین مطلب کاهش مصرف حافظه را هم مدنظر داشته باشید.