‫۸ سال و ۸ ماه قبل، یکشنبه ۲۰ دی ۱۳۹۴، ساعت ۱۷:۲۷
با سلام و عرض تشکر بابت مقاله بسیار مفیدتون.
با توجه به اینکه اینترفیس IContainer در کتابخانه StructureMap است. به نظر می‌رسد نیاز است بسته نوگت زیر نیز روی همه پروژه‌های سلوشن نصب گردد.
PM> install-package structuremap
یا حق
با تشکر از راهنماییتون.

- «مثلا بجای Count بنویسید Any (سریعتر است). »
بله، حق با شماست. حواسم نبود که دارم LinqToObject میزنم.

در زمینه LinqToEntity‌ها و کار با دیتابیس، چقدر با این گفته موافقید که "متد Any بهینه نبوده و کند می‌باشد و بهتر است از متد Count استفاده نماییم" ؟
چون در یک ویدئوی Clean Coding بیان شد که متد Any مختص LinqToObject است و برای LinqToEntity و کار با دیتابیس مناسب نمی‌باشد.

پ.ن: با عرض پوزش اگر سوال زیاد مرتبط با بحث جاری نیست.
البته نظرات زیادی مثل (^ و^) وجود دارد که همگی ویدئویی که بنده دیدم رو نقص می‌کنن!
سلام،
ابتدا از مطلب بسیار کاربردیتون تشکر می‌کنم.

سناریوی بنده بدین صورت است که یک task ارسال ایمیل دارم که روزی یکبار به کل کاربرام یک ایمیل رو ارسال می‌کنم. حال از آنجایی که می‌ترسم میل سرور crash کنه و نتونه با سرعت بالا به یکباره همه ایمیل‌ها رو ارسال کنه، بنده می‌خوام بین ارسال هر ایمیل یک تاخیر مثلا 1 ثانیه ای بذارم تا بدین صورت میل سرور زمان تنفس داشته باشه.

به نظر دوستان  آیا اصلا نیاز به ایجاد تاخیر زمانی هست ؟
اگر هست، آیا کد زیر درست است ؟
public override void Run()
{
    if (this.IsShuttingDown || this.Pause)
        return;
 
    var _myService = StructureMapObjectFactory.Container.GetInstance<IMyService>();
    var sendingEmailsData = _myService.GetSendingEmailsData();
 
    if (sendingEmailsData.Count > 0)
    {
        var reader = new StreamReader(SiteCoreManager.SCHEDULE_BODY_PATTERN_FILE_PATH);
        string bodyPattern = reader.ReadToEnd();
 
        foreach (var sendingEmailItem in sendingEmailsData)
        {
            MailSender.Send(bodyPattern, sendingEmailItem   );
 
            // ایجاد تاخیر
            Task.Delay(1000);                   
        }
 
    }
             
}
‫۹ سال و ۱ ماه قبل، جمعه ۲۳ مرداد ۱۳۹۴، ساعت ۱۸:۳۲
با سلام،
در این روش هکر خودش رو توی مسیر ورود و خروج پکت‌های سرور قرار میده و با کمک ابزارهایی پکت‌های ورودی و خروجی سرور رو شنود می‌کنه و اطلاعات رو ذخیره می‌کنه.
در این موارد اطلاعات حساسی مثل نام کاربری و کلمه عبور کاربران ک هدر صفحات ورود و یا حتی ثبت نام که بصورت Clear Text به سرور ارسال میشن، به راحتی در اختیار هکر قرار می‌گیرن.
بهترین راه حل مقابله با این قضیه استفاده از SSL روی سایت است. بدین صورت وقتی کاربر وارد یکی از صفحات سایت شما میشه، سرور یک پروتوکل امنیتی رو با مرورگر کاربر به اشتراک می‌گذاره و مرورگر کاربر متوجه میشه که باید بر اساس پروتکلی که دریافت کرده داده‌های ارسالیش رو در سمت کلاینت هش کنه و بعد برای سرور ارسال کنه. این روش امنیت بسیار بالایی داره.
‫۹ سال و ۵ ماه قبل، شنبه ۵ اردیبهشت ۱۳۹۴، ساعت ۲۲:۳۷
برای من ارور 404 میده و اصلا BeginRequest اجرا نمیشه...
(مثل حالتیه که WildCardDNS روی سرور تنظیم نشده باشه و درخواست‌ها به سایت اصلی بر نگرده)

به نظر "وقتی برنامه رو با development server خود vs اجرا میکنم ساب دومین‌ها کار میکنه ... با iis express که تست میکنم هم خطای 400 bad request میده "

دقیقا فکر کنم مشکل من هم همین باشه که با iiis express دارم برنامه رو اجرا می‌کنم.  میشه دوستان درباره development server خود vs توضیح بدن. 
‫۹ سال و ۵ ماه قبل، جمعه ۴ اردیبهشت ۱۳۹۴، ساعت ۲۳:۱۲
پیشنهاد بنده برای فرار از نوشتن کدهای تکراری CRUD استفاده از یک سرویس جنریک در پروژه می‌باشد که در کمترین حالتش می‌تونه عملیات Insert و Update و  Delete    رو انجام بده و در متد Select نیز حداقل یک لیست از کل رکوردها خروجی بده.

بدین صورت لایه سرویس یک همچین شکلی میشه :
IGenericService<T>
GenericService<T> : IGenericService

IUserService : IGenericService<User>
UserService : GenericService<User>, IUserService
حال آنکه متدهای Add,Delete,GetAll,Update و بصورت Virtual ایجاد می‌نماییم تا در صورت نیاز (معمولا نیاز خواهیم داشت که متد Update رو در برخی موارد Override کنیم) بتونیم درون کلاس‌ها متدهای را Override کنیم.
بنده این تکنیک در پروژه عملی تست کرده ام و مشکلی نداشته ام
‫۹ سال و ۷ ماه قبل، شنبه ۲۵ بهمن ۱۳۹۳، ساعت ۱۷:۴۰
سلام؛ کاملا با گفته شما موافقم. فقط مشکلی که دارم اینه که با کدهای تکراری لایه سرویس چه کنیم (CRUD). آیا راهی برای فرار از این کدها و صرفه جویی در زمان داریم ؟
‫۹ سال و ۷ ماه قبل، پنجشنبه ۲۳ بهمن ۱۳۹۳، ساعت ۰۳:۳۸
با سلام و با تشکر؛ با اجازه بنده کد فوق رو کامل‌تر کردم و یک سری کد جدید بهش اضافه کردم و برخی بخش‌ها رو هم تغییر داده ام:
1- به جای سوال ، بنده یک عبارت رو نمایش میدم
2- ارسال دیتا از طریق کوئری استرینگ که باعث میشه سشن دیگه نیاز نباشه و از مصرف حافظه رو تا حد زیادی کاسته بشه.
البته این مورد برای سایت‌های پربازدید خیلی قابل لمس است و ممکنه روی سایت‌های معمولی تفاوت زیادی احساس نشه.
3- ارسال داده بصورت هش شده ، که این رو بنده خودم با یک کلاس دست ساز معمولی به روش TripleDes انجام داده ام که دوستان به هر روشی می‌تونن داده هاشون رو هش کنن.
4- یکم حروف رو چرخوندم و فاصله بین حروف رو هم طوری تنظیم کردم که در عرض تصویر پخش بشن (از کل عرض تصویر استفاده بشه)
* شایان ذکر است که به نظر من روش فوق در ایجاد نویز‌های دایره ای بسیار زیبا بود، چون همیشه همه جا با یک سری خط ساده نویز ایجاد می‌کنن ولی روش فوق واقعا خلاقانه و قشنگ بود :)
ساختار کنترلر ریکپچای من :
public class CaptchaController : Controller
    {
        private static readonly Brush ForeColor = Brushes.Black;
        private const string FontName = "tahoma";
        private const int FontSize = 14;
        private const int Width = 130;
        private const int Height = 35;

        [HttpGet]
        public ActionResult Image(string cc)
        {
            if (string.IsNullOrEmpty(cc) || string.IsNullOrWhiteSpace(cc))
                return null;

            var captchaData = CustomHashing.DecryptTpl(cc);

            var rand = new Random((int)DateTime.Now.Ticks);

            // image stream
            FileContentResult img = null;

            using (var mem = new MemoryStream())
            using (var bmp = new Bitmap(Width, Height))
            using (var mtrx = new Matrix())
            using (var gfx = Graphics.FromImage((Image)bmp))
            {
                gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                gfx.SmoothingMode = SmoothingMode.AntiAlias;
                gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));

                //add noise
                int rn, xn, yn;
                var pen = new Pen(Color.Yellow);

                for (int i = 1; i < 10; i++)
                {
                    pen.Color = Color.FromArgb((rand.Next(0, 255)), (rand.Next(0, 255)), (rand.Next(0, 255)));

                    rn = rand.Next(0, (130 / 3));
                    xn = rand.Next(0, 130);
                    yn = rand.Next(0, 30);

                    gfx.DrawEllipse(pen, xn - rn, yn - rn, rn, rn);
                }

                //add chars
                #region draw pic

                float x = 1, y = 1;
                int degree = 10;

                for (int i = 0; i < captchaData.Length; i++)
                {
                    mtrx.Reset();

                    x = (float)(Width * (0.19 * i));

                    y = (float)(Height * 0.19);

                    degree = rand.Next(-25, 25);

                    if (i == 0 && degree > 20)
                    {
                        x += (FontSize + 5);
                        y -= 15;
                    }

                    mtrx.RotateAt(degree, new PointF(x, y));

                    gfx.Transform = mtrx;

                    gfx.DrawString(captchaData[i].ToString(), new Font(FontName, FontSize), ForeColor, x, y);

                    gfx.ResetTransform();
                }
                #endregion

                //render as Jpeg
                bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                img = this.File(mem.GetBuffer(), "image/Jpeg");
            }

            return img;
        }
برای استفاده هم داریم :
@{
    var r = new Web.Tools.CustomRandom();
    string hash = Web.Tools.CustomHashing.EncryptTpl(r.CraeteCapchaNumericData(4));
} 

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>test Index</title>
</head>
<body>
<div>

    <img src="@Url.Action("Image", "Captcha", new { cc = hash })" />

</div>
</body>
</html>
محتوای کلاس CustomRandom :
این کلاس به تعداد مورد نیاز کاراکتر عددی/عددی-حروفی می‌سازه و به شما تحویل میده
public class CustomRandom
 {
        /// <summary>
        /// ساخت یک عبارت عددی رندوم
        /// </summary>
        public string CraeteCapchaNumericData(int length)
        {
            var rnd = new Random((int) DateTime.Now.Ticks);
            var temp = new StringBuilder();

            for (var i = 0; i < length; i++)
                temp.Append(Convert.ToChar(rnd.Next(49, 58)));

            return temp.ToString();
        }

        /// <summary>
        /// ساخت یک عبارت رندوم
        /// </summary>
        public string CreateRandomName(int length)
        {
            var rnd = new Random((int) DateTime.Now.Ticks);
            var temp = new StringBuilder();
            var flag = 1;

            for (var i = 0; i < length; i++)
            {
                flag = rnd.Next(0, 15);

                if (flag < 5)
                    temp.Append(Convert.ToChar(rnd.Next(97, 123))); // lower
                else if (flag >= 5 && flag < 10)
                    temp.Append(Convert.ToChar(rnd.Next(49, 58))); // numeric
                else
                    temp.Append(Convert.ToChar(rnd.Next(65, 91))); // biger
            }

            return temp.ToString();
        } 
}
همانطور که گفتم پیاده سازی متد های DecryptTpl   و EncryptTpl  کلاس CustomHashing   رو به خود دوستان واگذار می‌کنم تا با هر الگوریتمی که دوست دارن این کار رو انجام بدن. (^)
امیدوارم کد بنده به دوستان کمک کنه.
موفق باشید
‫۹ سال و ۸ ماه قبل، شنبه ۱۸ بهمن ۱۳۹۳، ساعت ۰۴:۰۶
با سلام و تشکر بابت مقاله جذابتون.

درون سایت Rhino Moq معرفی شده و شما Moq رو معرفی کردید ، بنده با Moq و کدنویسی اون احساس راحتی بیشتری می‌کنم ، می‌خواستم بدونم توی عملکرد آیا با هم فرقی دارن ؟
بنده بیشتر درگیر ساخت یک تقلید از کانتکس هستم (دقیقا مشابه کاری که شما در مقاله جاری انجام داده اید)
می‌خواستم ببینم اگر Rhino امکانات خاصی در این زمینه ارائه نمیده با Moq کار کنم.
(دنبال یک فریم ورک تقید خوب هستم که همیشه با اون کار کنم و باهاش راحت باشم)
‫۹ سال و ۸ ماه قبل، شنبه ۱۸ بهمن ۱۳۹۳، ساعت ۰۳:۵۵
با سلام،

ابتدا از مقاله جذابتون تشکر می‌کنم.

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

احساس می‌کنم که جای لایه بیزینس توی پروژهام خالیه ، لایه ای که کار محاسبات ریاضی و سایر محاسبات عددی رو به عهده داشته باشه.
از یکی از اساتیدم هم شنیدم که پروژها رو بصورت زیر می‌سازند
لایه دیتا - لایه بیزینس - لایه سرویس - لایه UI

که به نظرم لایه دیتا عملیات CRUD رو به عهده داشته باشه و لایه بیزینس هم محسابات و کارای پیچیده رو انجام بده و لایه سرویس هم لایه ای است که متدهای لازم جهت دسترسی UI به متدهای مورد نیاز در لایه‌های دیتا و بیزینس رو فراهم می‌کنه.
مثلا ثبت یک خرید جدید که موجب اجرای متد Add در کلاس ProductService میشه که در این متد ، متد CalcCommission جهت محاسبه پورسانت‌ها اجرا میشه و سپس نتیجه دریافتیبه کمک متدهای مربوطه در لایه دیتا در دیتابیس ثبت میشه.

به نظر میاد این لایه بندی قشنگ‌تر باشه.
(کل لایه‌های DomainClassess و DatabaseContext و Services پروژه‌های من در لایه دیتا قرار می‌گیرن )

می‌خواستم نظر شما رو درباره لایه بندی بدونم ؟
(به دنبال بهترین روش لایه بندی می‌گردم ، یک استاندارد مطمئن)