MSF و Software Architecture


چند سال پیش، من یک presentation در مورد Microsoft Solutions Framework و Software Architecture یا همان معماری نرم‌افزار آماده کرده بودم و آن را به صورت نصفه و نیمه در محل کارم ارائه دادم، شاید این Slide Show برای کسانی که مایل هستند با این دو مقوله آشنایی پیدا کنند بد نباشد، از طریق آدرس زیر می‌توانید این Presentation را مشاهده و یا Download نمایید

مشکلات حروف فارسی چندگانه


  
برخی از حروف فارسی به چند شکل و به اصطلاح بر اسا Character Set های مختلف نوشته می‌شوند
مثلا:
"ک" و "ك"
"ی" و "ي"
که در اصل شکل‌های دوم عربی هستند
حالا اگر در پایگاه داده‌های شما هردو "ک" و هردو "ی" ذخیره شده باشند باید چه‌کار کرد؟
مثلا شما می‌خواهید یک Select بنویسید که تمام کسانی که نام آنها "بابک" است را برای شما بیاورد
دو نفر با نام بابک در جدول شما ذخیره شده‌اند یکی با "ک" و دیگری با "ك"
یک روش این است که دو شرط برای Select بگذارید که هردو بابک را چک کند، ولی اگر متنی که در حال جستجوی آن هستید طولانی باشد چه؟ اصلا اگر در متن شما هم "ک" وجود داشت و هم "ی" چه؟ یعنی باید ترکیب تمام حالات مختلف را در شرطتان اعمال کنید؟
در واقع اگر مجبور باشید باید این کار را بکنید ولی به‌جای نوشتن تمام متن در حالات مختلف می‌توانید توابعی بنویسید که این کار را برای شما انجام بدهند، این کدی‌است که من از آن استفاده می‌کردم:

  string MakeitFarsi(string NetString)
    {
        NetString = NetString.Replace((char)1705, (char)1603);
        return NetString.Replace((char)1740, (char)1610);

    }

این تابع کارکترهای عربی را با نظایر فارسی آنها معاوضه می‌کند

می‌توانید سه تابع دیگر هم برای جستجوی کارکترهای عربی و ترکیب آنها بنویسید، ولی پیشنهاد من این است که هنگام data entry یعنی وقتی که در حال ثبت اطلاعات در پایگاه داده‌ها هستید آنها را استاندارد سازی کنید، مثلا همه کارکترهای عربی را در آنها فارسی کنید و هنگام انجام جستجو فقط به‌دنبال کارکترهای فارسی بگردید، به‌این ترتیب یک تابع مثل تابع فوق کفایت می‌کند، البته با این شرط که همانطور که گفتم، یک بار هنگام ثبت اطلاعات از آن استفاده کنید و یک بار هم هنگام بازیابی.

Hashing و Encryption




Hashing و Encryption هردو روشهایی برای رمزنگاری هستند، نکته قابل توجه این است که هنگامی که متنی را Hash می‌کنید دیگر روش ساده‌ای تحت عنوان dehash کردن آن وجود ندارد و شما برای اینکه متنی را با آن مقایسه بکنید مجبورید آن متن را با همان شیوه Hash کنید و سپس با متن hash شده مقایسه نمایید، در صورتی که یک متن Encrypt شده را می‌توانید Decrypt کرده و با یک متن دیگر مقایسه کنید.

احتمالا می‌دانید که روشهای Encryption مختلفی وجود دارند، در اینجا من کدی را که سالها پیش با استفاده از الگوریتم SHA و با VB.NET نوشته بودم در اختیارتان می‌گذارم:

Imports System.Security.Cryptography
Imports System.Text
.
.
.
 Public Function GetEncryptedData(ByVal Data As String) As String

        Dim shaM As New SHA1Managed
        Convert.ToBase64String(shaM.ComputeHash(Encoding.ASCII.GetBytes(Data)))
        Dim eNC_data() As Byte = ASCIIEncoding.ASCII.GetBytes(Data)
        Dim eNC_str As String = Convert.ToBase64String(eNC_data)

        Return eNC_str

    End Function

    Public Function GetDecryptedData(ByVal Data As String) As String

        Dim dEC_data() As Byte = Convert.FromBase64String(Data)
        Dim dEC_Str As String = ASCIIEncoding.ASCII.GetString(dEC_data)
        Return dEC_Str

    End Function

همانطور که ملاحظه کردید دو تابع به منظور Encrypt مردن و Decrypt کردن در کد فوق نوشته شده‌است.

در مورد Hashing که معمولا برای نگهداری passeord ها استفاده می‌شود یکی از روشها استفاده از System.Web.Security است:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtPwd.Text, "MD5").ToString()

همانطور که ملاحظه کردید من از MD5 به عنوانت فرمت Hashing استفاده کردم

کار با Directory Services



اضافه کردن و یا حذف کردن یک User در یک Domain
اضافه کردن و یا حذف کردن یک Group در یک Domain
اضافه کردن و یا حذف کردن یک User در یک Group
اینها کارهای مدیریتی هستند که یک Network Administrator معمولا انجام می‌دهد، ولی اگر قرار باشد که این کارها از طریق نرم‌افزار شما انجام شود چه؟
در لینک زیر نمونه کدهایی که من سالها پیش به این منظور نوشته‌ام را پیدا می‌کنید، البته ممکن است که روش اجرای این کد کمی قدیمی شده باشد، این کد برای .NET Framework 1.1 و با VB.NET نوشته شده است.

Binding در Template Field


  
همانطور که می‌دانید ما به اشیای درون Template Field ها در کد، دسترسی مستقیم نداریم، شما به راحتی می‌توانید Bound Column به یک GridView اضافه کنید ولی اگر Template Field و یا به قول قدیمی‌تر ها Template Column داشته باشید و بخواهید اشیای موجود در آن را (مثلا متن یک Lable) را Bind کنید باید چه کار کرد؟

پاسخ، تابع Eval است، فرض ما این است که شما قبلا به خود Gridview یک Data source داده‌اید و حالا مشکل فقط نمایش Record های آن در اشیای مورد نظر شما است، در حقیقت Container شما دارای Datasource می‌باشد و کافیست که شما از طریق تابع Eval به فیلدهای آن دسترسی پیدا کنید.

شی DataBinder این تابع را در اختیار ما می‌گذارد:
DataBinder.Eval(container, "dataitem.Title")
در مثال فوق، شما به جای Title نام فیلد مورد نظر خود را خواهید گذاشت.

البته این کار را به این راحتی هم می‌توانید انجام دهید:
Eval(“Title”)
حالا این کد باید کجا نوشته بشود؟
کافیست که در محیط Edit Templates، روی شی مورد نظر کلیک کرده و Edit Bindings را برای آن انتخاب کنید، حالا با انتخاب Property مورد نظر و گزینه Custom binding  برای آن می‌توانید Code Expression مورد نظر را (Eval(“FieldName”)) برای آن بنویسید.

پیغام خطا برای Delete Button Field


  
اگر به یک Gridview یک Button Field اضافه کنید و Command Name آن را Delete بگذارید و ItemCommand Event را برای آن بنویسید، احتمالا وقت Raise شدن، پیغام خطایی مبنی بر Handle نکردن Event دریافت خواهید کرد، این خطا به این دلیل اتفاق می‌افتد که کلیلک کردن روی دکمه‌ای که شما Command Name ‌آن را Delete گذاشته‌اید دو Event را فراخوانی می‌کند: itemCommand و Delete را که شما دومی را Handle نکرده‌اید و این مشکل به دلیل کلمه Delete که یک Reserved word است بوجود می‌اید.

پیشنهاد می‌کنم که برای پیشگیری این مشکل، یا Command name را تغییر دهید و یا از یک Command Filed  از نوع Delete استفاده نمایید.