by Masoud
11. February 2012 02:00
کلاس های Generic کلاس هایی هستند که در حقیقت PlaceHolder هایی هستند که با توجه به آرگمان ورودی فعالیت هایی متناسب با اون نوع متغییر رو انجام میدن.
کلاس های Generic در ورژن های جدید .Net انقلاب بزرگی رو به وجود آوردند.
کلاس هایی مثل IList<T> ، Func<T,T> و ... مثال هایی از این نوع هستند.
کلاس های Generic برای محدود کردن ورودی هاشون از مکانیزم جالبی استفاده کنند.
شما در جلوی اسم کلاس میتونید محدودیت هایی رو برای ورودی ها در نظر بگیرید.برای درک بیشتر به مثال زیر توجه کنید :
public interface IEntity
{
Guid Guid { get; set; }
}
public class User : IEntity
{
public Guid Guid
{ get; set; }
// . . .
}
public class Department
{
// . . .
}
public class MyGenericClass<T>
where T : IEntity, new()
{
public T MyTType { get; set; }
public MyGenericClass()
{
MyTType = new T();
}
}
من کلاس MyGenericClass را محدود به استفاده از نوعی از ورودی کردم که فقط Interface ای به نام IEntity را پیاده سازی کرده باشد و حتمی متد سازنده داشته باشد.
تا اینجا همه چیز خوب انجام شده است ، اگر به متد سازنده کلاس MyGenericClass دقت کنید متوجه می شید که من یه متغیر از نوع ورودی را بدون اینکه به طور دقیق از ورودی اطلاعای داشته باشم ساخته ام.
ولی اگر من لازم داشته باشم به T برای ساخته شدن آرگمان پاس بدهم چی ؟
متاسفانه کلاس های Generic تنها امکانی که در اختیار برنامه نویس قرار می دهند فقط فهمیدن این نکته است که T حتمی قابلیت وحله سازی دارد.
ولی راه حل چیست ؟
راه حل استفاده از Activator ها است.
برای حل مشکل فوق راه زیر به خوبی کار خواهد کرد :
public class User : IEntity
{
public User (int id)
{
}
public Guid Guid
{ get; set; }
// . . .
}
public class MyGenericClass<T>
where T : IEntity, new()
{
public T MyTType { get; set; }
public MyGenericClass()
{
MyTType = new T();
}
public MyGenericClass(int id)
{
MyTType = (T)Activator.CreateInstance(typeof (T), id);
}
}
نکته : Activator ها Performance خوبی ندارند تا جایی که می توانید از روش هایی استفاده کنید که نیازی به استفاده از این روش نباشد.

by Masoud
28. November 2011 15:13
مطلبی رو جایی خوندم در مورد اینکه استفاده از var بجای تعریف صریح بهتره.از نظر سرعت تفاوتی نداره و در خوانایی هم بهتره !!!
جالب تر اینکه هیچ تغییری در روال انجام کار نداره و overhead ای به سیستم وارد نمی کنه.
برای اطمینان بیشتر خودم تست کردم و کد IL هم دقیقا یکی بود.
کلی سرچ کردم و همه هم همین نظر رو داشتن.
در آخر هم توی Twitter سوالم رو مطرح کردم و سهیل( مدیر سایت IDevcenter ) هم همین نظر رو داشت :


by Masoud
12. November 2011 12:30
معمولا برنامه نویس ها و توسعه دهنده ها برای کار های روزانه خودشون ،از یک سری ابزار استفاده می کنن که بهشون عادت دارن.
ایده ای به ذهنم رسید که از همکارام درخواست کنم ابزار هایی که ازش به طور روزمره استفاده می کنن رو معرفی کنن، این طوری اگر ابزار بهتری برای کار وجود داشته باشه به راحتی می تونیم اونو پیدا کنیم.
امید وارم بقیه همکارا و بلاگ نویس های عزیز هم این روند رو پیش بگیرن تا بتونیم به یک بسته اطلاعاتی خوب برسیم.
ابزار های من :
ابزار های برنامه نویسی :
VS 2010 :
این ابزار نیاز مسلم هر برنامه نویسی .Net هست که همه به خوبی اون میشناسیم و از قابلیت هاش آگاهیم
MS SQL Server 2008 :
این ابزار هم که نیازی به معرفی نداره و همه ما اونو میشناسیم.
ابزار های کمک برنامه نویسی :
ReSharper :
یک محصول فوقالعاده از شرکت jetbrains.
{ اگه دنبال کرک نسخ 6 هستید به اینجا یک سری بزنید }
ابزار های مدل سازی :
Enterprise Architect
یک محصول قوی از شرکت sparxsystems.
این ابزار با قابلیت های بالایی که در رسم و مدل سازی انواع نمودار های UML و کلا مدلینگ داره یکی از بهترین گزینه ها برای مدل سازی هست.در رابطه به ea آقای حاجی لو هم در وبلاگشون مطلب کاملی نوشتن که می تونید مطالعه کنید
این ابزار به علت پشتیبانی از زبان فارسی یکی از اولین انتخاب هاست.
ابزارهای کنترل سورس :
VS TFS { wiki }:
البته TFS فقط یک Source Control نیست و قابلیت های زیادی داره ولی بهترین انتخاب برای تیم هایی که به طور گسترده فعالیت میکنن هست.
TFS حتی یک بخش به نام Web Access داره که به کاربرا اجازه میده که سورس ها رو داخل محیط وب ( شبیه چیزی که در Codeplex هست ( ببینیم.
TFS به دلیل اینکه یکپارچگیه بسیار بالایی با VS 2010 داره اولین انتخاتب من بوده و هست.
TFS حتی میتونه به CRM ماکروسافت هم خط وصل بشه و کلی Functionality های خوبی رو به تیم بده.
آقای افشار محبی هم مطالبی در ضمینه TFS دارن که خوندشون خالی از لطف نیست.
مطلب فوق رو من در طول زمان تکمیل میکنم و نرم افزارهای جدیدی بهش اضافه می کنم.

by Masoud
16. October 2011 11:56
بیشتر شرکت ها معمولا برای کار هاشون یک سری کنترل طراحی میکنن که سرعت کارشون رو افزایش بده.
مثلا کنترل های
برای این کار شما فقط باید داخل یک کلاس از کلاس والدی مثل WebControl ارث بری کنید.
برای مثال شما برای کارتون قراره یک TextBox ایجاد کنید که با تایپ درونش قبل از LostFocus شدن از تکراری نبودن اطلاعات درونش اطمینان حاصل کنید.
به طور پیش فرش میشه این کار رو با چند خط کد جاوااسکریپت و یک سرویس ساده پیاده سازی کرد.
ولی شما به این کنترل احتیاج دارید و استفاده زیادی ازش می کنید.ژس منطقی نیست که هر دفعه این کد ها نوشته بشه.
شما می تونید به راحتی این کار رو انجام بدید.با یم سرچ ساده به اطلاعات کامل و خوبی می رسید.
احتمالا تا حالا به Property های داخل یک کنترل برخوردید که داخل بدنه کنترل نوشته میشن.
مثل این :
<asp:BulletedList runat="server" ID="bltList">
<asp:ListItem Enabled="true" Selected="False" Text="text1" Value="text1value" />
<asp:ListItem Enabled="true" Selected="False" Text="text2" Value="text2value" />
<asp:ListItem Enabled="true" Selected="False" Text="text3" Value="text3value" />
</asp:BulletedList>
برای ساختن کنترل هایی که بتونن به عنوان پراپرتی از شما اطلاعات بگیرن و زمان رندر از اونا استفاده کنن روشی وجود داره.
در مثال بالا BulletedList یک کنترل ASP.Net هست که مقادیر خودش رو داره و در کلاس BulletedList وجود دارند.
نکته اصلی اینجاست که ListItem ها هم کلاسی هست که مشخصات و پراپرتی های خودش رو داره.
ولی برای اینکه داخل BulletedList قابل شناسایی باشه شما باید یک پراپرتی از نوع اون کلاس مورد نظر ( در اینجا ListItem( و به صورت List تعریف کنید.
برای اینکه به کنترل بفهمونید که این لیست حاویه اطلاعات مختصل این کنترل هست و باید از توی Designer خونده بشن باید Attribute زیر رو هم به پراپرتی بدید :
[PersistenceMode(PersistenceMode.InnerProperty)]
public List<searchTextBoxEvent> SearchTextBoxEvents { get; set; }
برای اینکه کلاس والد بفهمه که باید پراپرتی های داخلی خودش رو هم چک کنه باید به کلاس والد Attribute زیر رو هم داشته باشه :
[ParseChildren(true)]
public class SearchTextbox : WebControl
{
//...
}

by Masoud
11. July 2011 01:10
حتمی شما توی پروژه هاتون دوست داشتید که Connection String در EF داخل فایل Web.Config یا App.Config قرار ندید که امنیت نرم افزارتون بالا بره.
ایده های زیادی در رفع مشکل فوق وجود داره ، از جمله :
- Encrypt کردن Web.Config (+ یک نسخه وطنی)
- ذخیره کردن Connection String در یک دیتابیس دیگر
- ذخیره کردن Connection String در یک فایل متنی مخفی
- Embed کردن Connection String در فایل های Resource
- ذخیره کردن Connection String به صورت HardCode ( البته این اصطلاح Hard Code غلطه )
- …
شما هر کدون از این روش ها رو که استفاده کنید بازم لازم دارید که به EF بفهمونید که Connection String کدومه.Code Generator بعد از Map کردن Entity ها ، سه مدل Constructor برای مدل شما می سازه:
- Constructor عادی و بدون پارامتر
- Constructor با پارامتر ConnectionString که یک String از شما دریافت میکنه.
- Constructor با پارامتر Connection که از نوع “EntityConnection” هست.
مورد اول که از اطلاعات Base که توسط Code Generator ساخته میشه استفاده میکنه.مورد دوم و سوم جای بحث دارن.
برای ادامه بحث باید ابتدا ساز و کار EF رو مورد بررسی قرار بدیم.EF برای Mapping از سه فایل CSDL ، SSDL و MSL استفاده میکنه.
این سه فایل اطلاعات اصلی برای برقراری ارتباط بین EF و DataBase رو بر عهده دارن که شمال اطلاعات Entity ها ، روابط و ... میشن.
EF برای پیکر بندی به این اطلاعات نیاز داره.به خاطر همین باید توی Connetion Strnig این اطلاعات وجود داشته باشه.یعنی آدرس این سه فایل داده بشه.ولی این سه فایل هنگام Build شدن به داخل یک فایل مرکزی با پسوند EDMX ترکیب میشن.راه حل آدرس دهی سادست.شما باید از کلاس “System.Data.EntityClient.EntityConnectionStringBuilder” برای ساختن Connection استفاده کنید.
روش پیاده سازی :
string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder()
{
Metadata = "res://*",
Provider = "System.Data.SqlClient" /* if the provider is MS SQL */,
ProviderConnectionString= "Reqular database connection string"
}.ConnectionString;
شاید از خودتون در مورد خط سوم یعنی آدرس دهی Metadata سوال کنید.این بخش آدرس همون سه فایل مذکور هست که باید داده می شد که به این شیوه از Resource ها خونده میشه و البته به صورت خودکار اون سه فایل رو خودش استخراج میکنه.شما فقط کافیه که این آین Connection رو که به صورت String هست به Constructor های EF بدید و تمام !
