csharp-praktikada---texniki-destek-tetbiqini-hazirlayiriq.-birinci-hisse

C# praktikada : Texniki dəstək tətbiqini hazırlayırıq. Birinci hissə

Hansısa bir proqramlaşdırma dilini öyrənməyin ən yaxşı yollarından biri təbii ki real praktikadır. Bu məqaləmizdən başlayaraq qarşıdakı bir neçə postlarda real praktikada C# dilinin bir sıra qaranlıq qalan , çoxlarının istifadə etməkdən çəkindiyi və ya ümumiyyətlə harada istifadə edəcəyini müəyyənləşdirməkdə çətinlik çəkdiyi bir sıra mövzuları real praktikada əhatə etməyə çalışacağıq.

           PS: Kodları buradan endirə bilərsiniz. Proqram EF code first məntiqi ilə yaradıldığına görə miqrasiyanı işə salmağı unutmayın.

  PSS: kodlar hələ yekun deyil, postlar yazıldıqca refaktor ediləcək və əlavə funksionallıq sistemə daxil ediləcək.

           Bu postlar seriyasını oxumaqla və verilən kodları araşdırmaqla aşağıdakı suallara cavab tapacaqsınız:

1)Atributları harada istifadə edim ?

2)Metod extension-lar nədir və praktikada tətbiqi

3)İnterfeysləri nə zaman yaradım?

4)Abstrakt klasları harada və nə səbəbə yaradım?

5)Necə səliqəli kod yazım və necə optimizasiya aparım?

6)UserControl-ların əhəmiyyəti və yaradılma yerləri

7)Statik üzvlərin proyektdə yeri

8)Refleksiya praktikada

9)Hadisələr və deleqatların praktikası və daha nələr nələr..

Texniki tapşırıq ilə buradan tanış ola bilərsiniz.

PSSS: Analiz və proyektləşdirilmə prosesi məqalələrdə əlavə yer tutduğuna görə əks olunmayıb. Məqsəd .NET-in sadalanan topiklərini anlamaq olduğundan məsələlərə arxitektur aspektdən yox, rahatçılıq üçün junior gözüylə, task aspektindən baxılıb.

Yazmağa başlayırıq...

İlk öncə registrasiya hissəni yerinə yetirək.

  private void btn_Register_Click(object sender, EventArgs e)
        {
            User user = this.MapDataToModel("txbx_")
                                             .WithDefaults();
            bool hasUser = true;

            if (this.IsValid(objectToValidate: user,errorsOn: lbl_error))
            {
                TicketsDbContext tdc = null;
                try
                {
                     tdc = new TicketsDbContext();
                    {
                        if (!tdc.Users.HasUser(user.Email))
                        {
                            tdc.Users.Add(user);
                            tdc.SaveChanges();
                            hasUser = false;
                        }
                    }
                    if (hasUser)
                        MessageBox.Show("This user already exists!");
                }
                catch(Exception exp)
                {
                    //TODO: write to log
                    MessageBox.Show(exp.Message);
                }
                finally
                {
                    tdc.Dispose();
                }
                
            }
        }

Registrasiya prosesində atılan addımlar aşağıdakı kimidir:

1)İstifadəçidən alınan məlumatlar modelləşdirilir.

2)Model validasiya olunur

3)Hər şey qaydasındadırsa ,bazada belə bir istifadəçinin olub olmadığı yoxlanılır.

 4)İstifadəçi yoxdursa  registrasiya olunur.

           Registrasiya pəncərəsini ayrıca bir User Control olaraq hazırlayırıq. Bu həmin kontrol-un təkrar istifadə olunmasına kömək edəcək.

           Hər dəfə formdan daxil edilən textbox məlumatlarının klasa yığılmasını yazmamaq üçün automapper xarakterli mini bir extension(genişlənmə) yazırıq. Bu genişlənmə vastəsilə formadakı textbox məlumatlarını klasa toparlayırıq.

 public static T MapDataToModel(this Form form,string withPrefix)
        {
             var typeProperties = typeof(T).GetProperties();
            var allTextBoxes = GetAllTextBoxes(form.Controls);
             T obj = Activator.CreateInstance();
            foreach (var item in typeProperties)
            {
                string propertyValue = allTextBoxes.Where(x => x.Name == $"{withPrefix}{item.Name}").FirstOrDefault()?.Text;
                item.SetValue(obj, propertyValue);
            }
            return obj;
        }

Extension metodun işləmə prinsipi çox sadədir. O həmişə formdakı textbox-ları tapır, onların adının map olunacaq klasın proterty-lərinə uyğun gəlib gəlməyəcəyini yoxlayır. Adəti üzrə textboxları “txbx_” ilə adlandığıma görə, “txbx_Name” elementinin Name property-sinə öz datasını yazması üçün metodumuz iqnor olunacaq hissəni (burada “txbx_”) bizdən tələb edir və klasın digər textbox-dan gəlməyən üzvlərinin doldurulması üçün WithDefaults() adlanan extension metod yazmışıq.

 public static User WithDefaults(this User registeredUser)
        {
            registeredUser.InvalidTry = default;
            registeredUser.IsActive = true;
            registeredUser.RegisterDate = DateTime.Now;
            registeredUser.RoleType = default;
            return registeredUser;
        }

           Bir neçə formda (loginForm və RegisterForm) həmçinin daxil edilən məlumatların düzgünlüyünün yoxlanılması prosesi də həyata keçirildiyinə görə bununçün də ayrıca extension metod yazmışıq. Bu metod EntityValidator(bizim klas) klasımızı çağıraraq validasiya aparır.Əgər validasiya errorları varsa ozaman ikinci arqumentdə ötürdüyümüz kontrolun tekstinə bu errorlar yazılır.

 public interface IValidator
    {
        IEnumerable Validate(object objecTToValidate);
    }


 public class EntityValidator : IValidator
    {
        public IEnumerable Validate(object objecTToValidate)
        {
            ValidationContext c = new ValidationContext(objecTToValidate,null,null);
            List errorResults = new List();
            if (!Validator.TryValidateObject(objecTToValidate, c, errorResults, true))
            {
                return errorResults;
            }
            else
                return default(List);
        }
    }

 public static class FormExtensions
    {
     public static bool IsValid(this Form form,object objectToValidate, Control errorsOn)
        {
            EntityValidator entityValidator = new EntityValidator();
            errorsOn.Text = "";
            IEnumerable validationResults = entityValidator.Validate(objectToValidate);

            //if has error..
            if (validationResults != null)
            {
                DisplayErrors(form, validationResults, errorsOn);
                return false;
            }
            else
                return true;
        }
    }

           Validasiya uğurlu keçdikdən sonra bazada belə bir emailin olub olmadığı yoxlanılır və yekunda istifadəçi bazaya əlavə edilir.

  public static class DbSetExtensions
    {
        public static bool HasUser(this DbSet usersSet, string email)
        {
            User user = usersSet
                             .Where(x => x.Email.Equals(email, StringComparison.OrdinalIgnoreCase))
                               .FirstOrDefault();

            return user == null ? false : true;
        }
        public static bool HasUser(this DbSet usersSet, LoginModel lg)
        {
           User user = usersSet.Where(x => x.Email.Equals(lg.Email, StringComparison.OrdinalIgnoreCase)
                             && x.Password.Equals(lg.Password, StringComparison.OrdinalIgnoreCase))
                            .FirstOrDefault();

            return user == null ? false : true;
        }
   }

 private void btn_Register_Click(object sender, EventArgs e)
        {
          ........
         ..........
if (this.IsValid(objectToValidate: user,errorsOn: lbl_error))
            {
                TicketsDbContext tdc = null;
                try
                {
                     tdc = new TicketsDbContext();
                    {
                        if (!tdc.Users.HasUser(user.Email))
                        {
                            tdc.Users.Add(user);
                            tdc.SaveChanges();
                            hasUser = false;
                        }
                    }
                    if (hasUser)
                        MessageBox.Show("This user already exists!");
                }
                catch(Exception exp)
                {
                    //TODO: write to log
                    MessageBox.Show(exp.Message);
                }
                finally
                {
                    tdc.Dispose();
                }
         }
      }
                

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz