نظرات مطالب
چند نکته کاربردی درباره Entity Framework
این خطا زمانی پیش می‌آید که personelAction ای قبلا با همین Id در DbContext شما موجود باشد و شما بخواهید وهله ای (نمونه ای) دیگر از personelAction را به DbContext جاری وارد کرده و State آن را Modified‌قرار بدید. بنابراین در else نیاز هست که چک کنید personelAction.Id قبلا در DbContext موجود است یا خیر
نظرات مطالب
وی‍‍ژگی های پیشرفته ی AutoMapper - قسمت دوم
چک کن قبل مپ کردن پراپرتی هات نال نباشن.برای برسی دقیقتر کد رو بزار

شدنش میشه و بستگی به طراحی شما تو لایه سرویس داره و در اون صورت دیگه نیازی به استفاده از این کلاس کمکی هم نداری.


نظرات مطالب
Google OpenID Authentication در ASP.NET با استفاده از DotNetOpenAuth
در صورتی که بخواهید لاگ بندازید باید خود کد نویسی کرده و در دیتابیس ذخیره کنید
بله می‌توان در هر صفحه با استفاده از کلیدی که در سشن کاربر ذخیره کرده اید (با توجه به اینکه سشن کاربران جداست) می‌توانید وجود کاربر را چک کنید
نظرات مطالب
CheckBoxList در ASP.NET MVC
از توضیحات مطلب فوق ایده بگیرید. مثلا:
@if (item.Selected) { <text>checked="checked"</text> }
این روشی هست برای انتخاب یک گزینه بر اساس شرط. اگر انتخاب شده بود (یا هر شرط دیگری)، چک مارک آن قرار داده می‌شود.
نظرات مطالب
EF Code First #1
برای اینکه بانک اطلاعاتی به طور خودکار تشکیل بشه،اجرای هر دستوری که به بانک مربوط میشه کافیه؟مثلا دستور select ؟
بعد از اون به ازای هربار اجرای یک دستور، وجود یا عدم وجود DB چک میشه؟
پاسخ به بازخورد‌های پروژه‌ها
مشکل در دریافت خروجی pdf به صورت FlushInBrowser
ممنون بابت پاسختون.
این مواردی که فرمودید رو چک کردم، مشکل حل نشد.
اما فکر میکنم به خاطر این هست که دکمه Export من تو UpdatePanel هست، راهی وجود داره که بشه این مشکل رو حل کرد؟
پاسخ به بازخورد‌های پروژه‌ها
خطای هم نامی خواص راهبری
سلام. nested property‌ها در این کتابخانه فقط از نوع کلاس هستند، می‌توان آنها را از اینترفیس هم داشته باشیم؟
منظورم متد isNestedProperty  هستش که فقط چک میکند که کلاس باشد و نه اینترفیس.
در حال حاضر nested property‌های من رو که از جنس اینترفیس هستند شناسایی نمی‌کند.
با تشکر
بازخوردهای پروژه‌ها
ساده سازی استفاده

استفاده از این پروژه مشکل است. به عبارتی کدهای فایل default.aspx.cs را باید بتوان در یک کنترل یا حداقل یک یوزر کنترل کپسوله کرد و کاربر نهایی صرفا آن‌را روی فرم قرار دهد و یک سری خواص را چک کند. پیاده سازی پشت صحنه آن بهتر است تا حد امکان مخفی شود.

مطالب
تست کردن Command/Command Handler ها در MediatR
شاید شما هم در پروژه خودتان نیاز داشته باشید تا اتصالات MediatR را بررسی یا به نوعی از صحت کدهایی که بر پایه MediatR زدید مطمئن شوید. در اینجا به بررسی نحوه Assert کردن اتصالات MediatR می‌پردازم. اول از همه باید به این فکر کرد که چه چیزی را می‌خواهیم تست کنیم؟ طبیعتا وقتی یک Command را ایجاد میکنیم، انتظار داریم که یک CommandHandler مختص به آن نیز ایجاد شده باشد. پس ما به بررسی ساختار کد می‌پردازیم.
برای شروع، یک Interface را با متد IsValid را ایجاد میکنیم. این Interface بعد‌ها توسط کلاس CommandValidator پیاده سازی می‌شود تا هر وظیفه، تشخیص درست بودن اتصالات command را چک کنند.
همانطور که مشخص است، متد IsValid دو پارامتر اسم ارسال کننده (Command,Query,Notification) و اسم Handler این ارسال کننده‌ها را دریافت میکند.
internal interface IValidation
    {
        bool IsValid(string sendNamesEndTo, string handlerNamesEndTo);
    }
کد زیر نحوه پیاده سازی IValidation را برای کلاس CommandValidator، نشان میدهد:
  public bool IsValid(string commandNamesEndTo = "Command", string commandHandlersEndTo = "CommandHandler")
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            var commandTypeInfos = assemblies.SelectMany(x => x.DefinedTypes.Where(typeInfo =>
                typeInfo.Name.ToLower().EndsWith(commandNamesEndTo.ToLower()) &&
                typeInfo.ImplementedInterfaces.Any(type => type == typeof(IBaseRequest))));

            var memberInfos = commandTypeInfos as TypeInfo[] ?? commandTypeInfos.ToArray();
            if (!memberInfos.Any())
                throw new ArgumentException("Can not find any Command");

            var handlerTypeInfo = assemblies.SelectMany(x => x.DefinedTypes.Where(typeInfo =>
                typeInfo.Name.ToLower().EndsWith(commandHandlersEndTo.ToLower())));

            var typeInfos = handlerTypeInfo as TypeInfo[] ?? handlerTypeInfo.ToArray();
            if (!typeInfos.Any())
                throw new ArgumentException("Can not find any CommandHandler");

            if (typeInfos.Count() != memberInfos.Count())
                return false;

            return !(from typeInfo in memberInfos
                let interfaces = typeInfos.SelectMany(x => x.ImplementedInterfaces)
                where interfaces.Any(x => x.GenericTypeArguments.All(type => type != typeInfo))
                select typeInfo).Any();
        }
همانطور که مشخص است، برای دو پارامتر ورودی، مقادیر پیش فرض Command و CommandHandler در نظر گرفته شده‌اند. توجه داشته باشید این اسم کامل نیست و تنها نام انتهای کلاس است: برای مثال OrderCommand/OrderCommandHandler:
public bool IsValid(string commandNamesEndTo = "Command", string commandHandlersEndTo = "CommandHandler")
داخل بدنه متد، ابتدا تمام Assembly‌های موجود در App را لیست میکنیم :
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
سپس تمام کلاس‌های تعریف شده‌ای را که از IBaseRequest ارث بری کرده و انتهای نام آن‌ها شامل commandNamesEndTo باشد، لیست می‌کند. می‌توان گفت تا اینجا تمام Command‌ها را پیدا کرده‌ایم. در صورتیکه لیست موجود خالی باشد، یعنی یک‌جای کار مشکل دارد؛ شاید کلا Command ای تعریف نشده یا ... پس یک ArgumentException را throw میکنیم.
            var commandTypeInfos = assemblies.SelectMany(x => x.DefinedTypes.Where(typeInfo =>
                typeInfo.Name.ToLower().EndsWith(commandNamesEndTo.ToLower()) &&
                typeInfo.ImplementedInterfaces.Any(type => type == typeof(IBaseRequest))));

            var memberInfos = commandTypeInfos as TypeInfo[] ?? commandTypeInfos.ToArray();
            if (!memberInfos.Any())
                throw new ArgumentException("Can not find any Command");
در مرحله‌ی بعدی، تمام Handler‌ها را پیدا و لیست میکنیم. در اینجا نیز مانند کد بالا، اگر لیست خالی باشد، به این معناست که هیچ handler ای تعریف نشده‌است.
  var handlerTypeInfo = assemblies.SelectMany(x => x.DefinedTypes.Where(typeInfo =>
                typeInfo.Name.ToLower().EndsWith(commandHandlersEndTo.ToLower())));

            var typeInfos = handlerTypeInfo as TypeInfo[] ?? handlerTypeInfo.ToArray();
            if (!typeInfos.Any())
                throw new ArgumentException("Can not find any CommandHandler");
مرحله بعدی، بررسی کردن تعداد Command‌ها و CommandHandler‌ها می‌باشد. طبیعتا باید مقدار این دو برابر باشند؛ چرا که هر Command، نیاز به یک  CommandHandler نیز دارد. بنابراین اگر تعداد این دو یکسان نبود، ساختار ما درست نیست؛ پس مقدار false برگشت داده می‌شود : 
    if (typeInfos.Count() != memberInfos.Count())
                return false;
بعد از تمام این ماجرا‌ها، به مرحله آخر میرسیم؛ آن هم چک کردن نظیر به نظیر Command‌ها با CommandHandler‌ها می‌باشد. به این صورت که اگر به ازای هر Command تعریف شده یک CommandHandler با GenericTypeArguments از نوع command وجود داشته باشد، می‌توان گفت که ساختار ما درست تعریف شده‌است.
return !(from typeInfo in memberInfos
                let interfaces = typeInfos.SelectMany(x => x.ImplementedInterfaces)
                where interfaces.Any(x => x.GenericTypeArguments.All(type => type != typeInfo))
                select typeInfo).Any();
توجه داشته باشید برای تست کردن قسمت‌هایی مثل Query و Notification نیز می‌توان از همین فرآیند بهره برد؛ البته با کمی تغییر در پیاده سازی متد IsValid.
در نهایت برای استفاده می‌توان به شکل زیر کد‌ها را استفاده کرد : 
var validCommandConfiguration = new CommandValidator().IsValid();

برای دیدن کد‌های کامل پیاده سازی تست Command/Query/Notification، می‌توانید از لینک گیت هاب زیر استفاده کنید.
مطالب
اجرای سرویسهای NodeJS در ASP.NET Core
 این نوشتار در مورد نحوه اجرای سرویس‌های NodeJS در ASP.NET Core می‌باشد؛ زیرا تعداد زیادی از Package‌های سورس باز و با کیفیت بالا به فرم Node package manager یا به اصطلاح NPM موجود و قابل دریافت می‌باشند. NPM بزرگترین مخزن دنیا از لحاظ وجود بسته‌های نرم افزاری سورس باز است. به همین جهت بسته Microsoft.AspNetCore.NodeServices، جهت استفاده از این بسته‌ها در برنامه‌های ASP.NET Core ارائه شده‌است. برای استفاده از سرویسهای Node ابتدا باید ارجاعی را به بسته Microsoft.AspNetCore.NodeServices داشته باشید. برای این منظور میتوانید از دستور dotnet add package Microsoft.AspNetCore.NodeServices استفاده نمایید. البته اگر از آخرین نسخه NET Core. استفاده میکنید، لزومی به ارجاع به بسته فوق نمی‌باشد و به صورت پیشفرض در بسته Microsoft.AspNetCore.All موجود است.
سپس متد ()ConfigurationServices را جهت اضافه کردن میان افزار Node Services به خط لوله درخواستها (request pipeline) ویرایش میکنیم:
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddNodeServices();
}

حال میتوانید به وهله‌ای از اینترفیس INodeServices، از طریق تزریق وابستگی‌ها دسترسی داشته باشید. اینترفیس INodeServices یک Api می‌باشد و مشخص می‌کند که کدام قطعه از کد NET. میتواند کد جاوااسکریپتی را که در محیط Node اجرا می‌شود، فراخوانی کند. همچنین میتوانید از خاصیت FromServices برای دریافت وهله‌ای از اینترفیس INodeServices در اکشن خود استفاده نمایید.
public async Task<IActionResult> Add([FromServices] INodeServices nodeServices)
{
    var num1 = 10;
    var num2 = 20;
    var result = await nodeServices.InvokeAsync<int>("AddModule.js", num1, num2);
    ViewData["ResultFromNode"] = $"Result of {num1} + {num2} is {result}";
    return View();
}

سپس کد جاوااسکریپتی متناظر با تابعی را که توسط متد InvokeAsync فراخوانی میشود، به صورت زیر می‌نویسیم:
module.exports = function(callback, num1, num2) { 
  var result = num1 + num2;
  callback(null, result); 
};
دقت کنید که نام فایل جاوااسکریپت باید همنام با پارامتر اول متد InvokeAsync و تعداد پارامترهای تابع باید مساوی با پارامترهایی باشد که به تابع فراخوانی شده جاوااسکریپت ارسال می‌شود.

حال بیاییم مثالی دیگر را مرور کنیم. میخواهیم از صفحه وب درخواستی، عکسی را تهیه کنیم. بدین منظور از کتابخانه url-to-image استفاده میکنیم. برای نصب آن دستور npm install --save url-to-image را در خط فرمان تایپ میکنیم.

بعد از اتمام نصب این بسته، متدی را برای دریافت اطلاعات ارسالی این کتابخانه تدارک میبینیم.

 [HttpPost]
        public async Task<IActionResult> GenerateUrlPreview([FromServices] INodeServices nodeServices)
        {
            var url = Request.Form["Url"].ToString();
            var fileName = System.IO.Path.ChangeExtension(DateTime.UtcNow.Ticks.ToString(), "jpeg");
            var file = await nodeServices.InvokeAsync<string>("UrlPreviewModule.js", url, System.IO.Path.Combine("PreviewImages", fileName));
            return Content($"/Home/Download?img={fileName}");
        }

        public IActionResult Download()
        {
            var image = Request.Query["img"].ToString();
            var fileName = System.IO.Path.Combine("PreviewImages", image);
            var isExists = System.IO.File.Exists(fileName);

            if (isExists)
            {
                Response.Headers.Add($"Content-Disposition", "attachment; filename=\"" + image + "\"");
                var bytes = System.IO.File.ReadAllBytes(fileName);
                return File(bytes, "image/jpeg");
            }
            else
            {
                return NotFound();
            }
        }

سپس متد UrlPreviewModule.js را به صورت زیر مینویسیم:

var urlToImage = require('url-to-image');
module.exports = function (callback, url, imageName) {
    urlToImage(url, imageName).then(function () {
        callback(null, imageName);
    }).catch(function (err) {
        callback(err, imageName);
    });
};


سرویس‌های Node به توسعه دهندگان ASP.NET Core امکان استفاده از اکوسیستم NPM را که دارای قابلیتهای فراوانی می‌باشد، میدهد.