اشتراکها
نظرات نظرسنجیها
آیا با وجود سیاماس فروشگاهی قدرتمندی مثل nopCommerce یا SmartStore آیا منطقی است که ما دوباره خودمان از صفر کد بزنیم؟
نکته بسیار مهم :
هر ابزاری برای هر کاری مناسب نیست. هر دو موردی که در نظر سنجی نام برده شده راه کارهای سطح متوسط در ecommerce محسوب میشوند. بهتر بود نظر سنجی را به صورت چند انتخابی طراحی میکردید.
طبیعتا هزینه تمام شده نقش مهمی در کسب موفقیت در این زمینه دارد. نوشتن یک بستر جامع ecommerce کاری بسیار پر هزینه است. نمونههای موجود ایرانی و خارجی که از صفر نوشته شده اند حداکثر در حد متوسط قرار میگیرند.
اگر قصد شما داشتن چیزی مثل دیجیکالا است و چنان برنامه و بودجه ای دارید نوشتن از صفر یا توسعه یک CMS پیشرفته گزینه مناسبی است. ولی اگر شمار فروشنده ecommerce هستید و خدمات آن را ارائه میدهید تعداد مشتریانی که از شما کار سفارشی بخواهند خیلی کم است و بیشتر کسب و کارها نیاز به یک راه کار آماده ماژولار دارند و بودجه آنها در همین حد آنها را متوقف میکند.
با تجربه ای که در ecommerceهای مختلف داشته ام (PHP و ASP.NET) در مقیاسهای کوچک، متوسط ، بزرگ و خیلی بزرگ به شما پیشنهاد میکنم هر ابزاری را برای کاربرد مناسب انتخاب کنید. هیچ CMS همه کاره ای برای همه پروژهها وجود ندارد.
کلمه قدرتمند! یک کلمه فنی نیست، بیشتر به درد بازاریابی میخورد. nopcommerce در حد برداشتن یک سنگ متوسط قدرتمند است. نه برای یک فروشگاه چند منظوره بین المللی با عملیات تجاری سنگین.
اشتراکها
ویژگیهای احتمالی C# 11
اشتراکها
پسزمینههای Windows 11 برای دریافت
اشتراکها
بررسی عمیقتر Windows 11
اشتراکها
11 اعلان CSS
نظرات اشتراکها
مقایسه کارآیی Net Core 2.0. و Java
نظرات بسیاری بود ، اما باید توجه داشت برای مثال که linq از سال 2007 در دات نت وجود داره و کاربران سایت مذکورlinq رو با امکانات java 9 (ارائه شده در جولای 2017) یا زبان kotlin (اعلام پشتیبانی گوگل از این زبان در کنفرانس 2017) مقایسه کرده اند ؛ نکته مهم دیگه اینه که بسیاری از برنامه نویسان جاوا تحت اندروید مشغول توسعه هستند که حتی امکانات جاوا 8 رو هم بطور ناقص در اختیار دارند .نکته مهمتر اینکه مطابق هدف نویسنده مقاله " هدف بحث بر سر بهتر بودن یک زبان نسبت به دیگری نیست" هر برنامه نویس حرفه ای ،بدون هر گونه تعصب ابزار مناسب هر پروژه رو انتخاب و به نحو بهینه استفاده خواهد کرد.
در زمان ساخت مدل از بانک اطلاعاتی در روش Database First به صورت پیش فرض تنظیمات مربوط به اتصال (Connection String) مدل به بانک اطلاعاتی در فایل config برنامه ذخیره میشود. مشکل این روش آن است که در سیستمهای مختلف، بسته به بستری که نرم افزار قرار است بر روی آن اجرا شود، باید تنظیمات مربوط به بانک اطلاعاتی صورت گیرد.
همانطور که مشاهده میکنید، در Constructor این کلاس، نام Connection String مورد استفاده جهت اتصال به بانک اطلاعاتی به صورت زیر آورده شده که به Connection String ذخیره شده در فایل Config اشاره میکند:
جهت تولید پویای Connection String، بسته به تنظیمات کاربر، نیاز است تا در آخر Connection String ی با فرمت بالا در اختیار Entity Framework قرار دهیم تا امکان اتصال به بانک فراهم شود. جهت تبدیل Connection String معمول ADO.NET به Connection String قابل فهم EF میتوان از کلاس EntityConnectionStringBuilder به صورت زیر استفاده کرد:
همانطور که مشاهده میکنید، متد بالا با دریافت یک connectionString که همان ADO.NET ConnectionString ما میباشد، تنظیمات و Metadata مورد نیاز Entity Framework را به آن اضافه کرده و یک EF ConnectionString برمیگرداند.
با اضافه شدن پارامتر connectionString به سازنده کلاس PersonnelyEntities برای ساخت یک نمونه از مدل ساخته شده در کد نیاز است تا Connection String مورد نظر جهت برقراری ارتباط با بانک را به عنوان پارامتر، به متد سازنده پاس دهیم. سپس مقدار این پارامتر به کلاس والد ( DbContext ) جهت برقراری ارتباط با بانک اطلاعاتی ارجاع داده شده:
در آخر به صورت زیر میتوان توسط EF به بانک اطلاعاتی مورد نظر متصل شد :
با این روش میتوان ADO Connection String مربوط به اتصال بانک اطلاعاتی را به راحتی به صورت داینامیک به وسیله اطلاعات وارد شده توسط کاربر و کلاسهای تولید Connection String نظیر SQLConnectionStringBuilder تولید کرد و بدون تغییر در کدهای برنامه، به بانکهای مختلفی متصل شد. همچنین با داینامیک کردن متد Provider کلاس EntityConnectionStringBuilder که در کد بالا با "System.Data.SqlClient" مقدار دهی شده، میتوان وابستگی برنامه بانک اطلاعی خاص را از بین برد و بسته به تنظیمات مورد نظر کاربر، به موتورهای مختلف بانک اطلاعاتی متصل شد که البته لازمه این کار رعایت یکسری نکات فنی در پیاده سازی پروژه است که از حوصله این مقاله خارج است.
مثلا فرض کنید شما در زمان توسعه نرم افزار، SQL Server را به صورت Local بر روی سیستم خود نصب کرده اید و Connection String ساخته شده توسط ویزارد Entity Framework بر همین اساس ساخته و ذخیره شدهاست. حال بعد از انتشار برنامه، شخصی تصمیم دارد برنامه را بر روی سیستمی نصب کند که بانک اطلاعاتی Local نداشته و تصمیم به اتصال به یک بانک اطلاعاتی بر روی سرور دیگر یا با مشخصات (Login و Password و ...) دیگر را دارد. برای این مواقع نیاز به پیاده سازی روشی است تا کاربر نهایی بتواند تنظیمات مربوط به اتصال به بانک اطلاعاتی را تغییر دهد.
روشهای مختلفی مثل تغییر فایل app.config به صورت Runtime یا ... در سایتهای مختلف ارائه شده که اکثرا روشهای غیر اصولی و زمانبری جهت پیاده سازی هستند.
سادهترین روش جهت انجام این کار، اعمال تغییری کوچک در Constructor کلاس مدل مشتق شده از DBContext میباشد. فرض کنید مدلی از بانک اطلاعاتی Personnely با نام PersonallyEntities ساخته اید که حاصل آن کلاس زیر خواهد بود:
public partial class PersonallyEntities : DbContext { public PersonallyEntities() : base("name=PersonallyEntities") { } }
"name=PersonallyEntities"
اگر به Connection String ذخیره شده در فایل Config دقت کنید متوجه میشوید که Connection String ذخیره شده، دارای فرمتی خاص و متفاوتی نسبت به Connection String معمولی ADO.NET است. متن ذخیره شده شامل تنظیمات و Metadata مدل ساخته شده جهت ارتباط با بانک اطلاعاتی نیز میباشد:
metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=Personally;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
public static string BuildEntityConnection(string connectionString) { var entityConnection = new EntityConnectionStringBuilder { Provider = "System.Data.SqlClient", ProviderConnectionString = connectionString, Metadata = "res://*" }; return entityConnection.ToString(); }
برای اینکه بتوان EF ConnectionString تولید شده را در هنگام اجرای برنامه به صورت Runtime اعمال کرد، نیاز است تا تغییر کوچکی در Constructor کلاس مدل تولید شده توسط Entity Framework ایجاد کرد. کلاس PersonnelyEntities به صورت زیر تغییر پیدا میکند:
public partial class PersonallyEntities : DbContext { public PersonallyEntities(string connectionString) : base(connectionString) { } }
: base(connectionString)
var entityConnectionString = BuildeEntityConnection("Data Source=localhost;Initial Catalog=Personally; Integrated Security=True"); var PersonallyDb = new PersonallyEntities(entityConnectionString);
موفق باشید
در مورد نکته هشتم...
من قبلا هم این نظر خودم رو عنوان کردم. ولی به دلیل رعایت همین نکته هشتم، شما حتی منتشرش هم نکردید!
کاملا قبول دارم که اینجا یک پایگاه کاملا فنی هستش و امتیاز مثبتش هم همینه. اما قبول کنید برای یک برنامه نویس ( یا هر حرفه دیگه ای) علاوه بر نکات فنی، یک سری نکات هم هست که شاید بشه بهش گفت اخلاقیات حرفه، یا ترفندهای حرفه یا ...هر اسم دیگه ای. مثل تجربیاتی که مثلا شما از کار در محیطهای مختلف به دست آوردید، روشهای به روز نگه داشتن خود، چگونگی طی کردن مراحل پیشرفت و ..
کاملا قبول دارم که اینجا یک پایگاه کاملا فنی هستش و امتیاز مثبتش هم همینه. اما قبول کنید برای یک برنامه نویس ( یا هر حرفه دیگه ای) علاوه بر نکات فنی، یک سری نکات هم هست که شاید بشه بهش گفت اخلاقیات حرفه، یا ترفندهای حرفه یا ...هر اسم دیگه ای. مثل تجربیاتی که مثلا شما از کار در محیطهای مختلف به دست آوردید، روشهای به روز نگه داشتن خود، چگونگی طی کردن مراحل پیشرفت و ..
به نظر من شاید بشه نکات فنی رو از کتابها دریافت کرد، ولی این نکات که من عنوان کردم حتی اگه نمونه خارج از کشوری هم داشته باشن، شاید کارایی لازم رو در داخل کشور نداشته باشن، یعنی بومی سازی نشدن! و البته این مطالب با مطالب بی فایده ای که بعضی وبلاگها منتشر میکنند و خاطرات و مسایل شخصی خودشون رو در محیط کار مطرح میکنند متفاوته.
امیدوارم تونسته باشم منظورم رو بیان کنم.
نظرات مطالب
معرفی کتاب: مرجع کامل ASP.NET MVC 4
سلام بهروز جان
مثل همیشه عالی
موفق باشی