Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, turiu ce toki klausima susijusi su Events C# kalboje. Maciau daug pavizdziu ir visur pagrindine mintis buna tokia: "Norint obijektui A (potencialiai ir daugiau obijektu) pranesti, kad kazkas nutiko obijektui B galim panaudoti event's kaip transportavimo mechanizma. Na isivaizduokim turiu keleta "Logger" klasiu ir noriu jog jos logintu zinutes kurias iveda vartotojas.

 

Main:

   class Program
   {
       static readonly NotificationPipeline NotificationPipeline = new NotificationPipeline ();
       static readonly TextLogger TextLogger = new TextLogger();
       static readonly XmlLogger XmlLogger = new XmlLogger();

       static void Main(string[] args)
       {
           Console.WriteLine("Enter name:");
           var name = Console.ReadLine();

           Console.WriteLine("Enter password:");
           var password = Console.ReadLine();

           NotificationPipeline.SecretOperation += TextLogger.WriteText;
           NotificationPipeline.SecretOperation += XmlLogger.WriteXml;

           NotificationPipeline.OnSecretOperation(name, password);

           Console.ReadLine();
       }
   }

 

Logger klases:

   public class XmlLogger
   {
       public void WriteXml(string name, string password)
       {
           using (var stream = new FileStream("myXmlLog.xml", FileMode.Create))
           {
               var doc = new XDocument(new XElement("UserInfo",
                                       new XElement("UserName", name),
                                       new XElement("AccessCode", password)));

               doc.Save(stream);

               Console.WriteLine("XmlLogger logged your message.");
           }
       }
   }

   public class TextLogger
   {
       public void WriteText(string name, string password)
       {
           using (var streamWriter = new StreamWriter("myCustomLog.txt"))
           {
               streamWriter.WriteLine("Login: {0}", name);
               streamWriter.WriteLine("Password: {0}", password);

               Console.WriteLine("TextLogger logged your message.");
           }
       }
   }

 

Klase kurioje patalpinau event'a:

   public delegate void UserCredentialHandler(string userName, string password);

   public class NotificationPipeline
   {
       public event UserCredentialHandler SecretOperation;
       public void OnSecretOperation(string userName, string password)
       {
           if (SecretOperation != null)
               SecretOperation(userName, password);
       }
   }

 

Mano supratima apie event'us labai gerai parodo sitas paveikslelis:

 

image_172FE501.png

 

Nesuprantu event naudos nes vistiek turiu naujinti instances klaseje kuriame yra Main metodas tam kad galeciau subscribinti i eventa. Ar nepaprasciau butu rasyti InstanceName.MethodName(); ?? As aisku suprantu, kad siame mazame pavizdyje naudoti eventus yra overkill, na bet isivaizduokime kad turiu dar koki 10 klasiu kurios turi gauti sias zinutes, mano galva esme islieka tapati nes juk turiu gauti instance tai InstanceName.MethodName(); lyg ir paprasciau. Kas keisciausia, tai kad man viskas aisku kai naudojami event'ai WPF, WinForm's appsuose, kai yra subscribinama i UIElement'o eventus. Bet kai reikia kazka su event'ais padaryti paciam (grinai mokymosi tiksliais) as juose nematau prasmes. O beveik visur kur beskaityciau rasoma "Events play important part in .NET framework and also in a line of enterprise applications". Butent important zodelis man ir neduoda ramybes nes atrodo, kad as ce vienas toks kuriam nedaeina :)

 

P.S. Be sito pavyzdzio ka ce parasiau turiu pas save padares WPF applicationa pagal MVVM. Turiu klases ShippingService, BillingService, OrderService ir dar keleta. Noreciau, kad kai vartotojas spaudzia migtuka "CheckOut" servisu metodai kurie yra subscribine i tam tikra eventa pradetu savo darbus (shipping, billing etc..) Bet velgi, as savo VM turiu siu service instances tai tiesiog kvieciu metoda per instance. Aisku viskas veikia kaip ir turi veikti tik beda ta, kad kuriau as ji tai event'ams ismokti o aiskios naudos juose nematau.. Jei galit pateikit pavyzdziu savu kas turit, kad grinai matytusi nauda pacio panaudojimo. Aciu :)

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu uz issamius atsakymus :) (joke)

Na ce panagrnejau truputi ir jau matau sviesa tunelio gale :) Truputi ispleciau programa. Toks panaudojimas validus ar nelabai jusu akim? (Aisku klasiu instances kurciau bootstrap'erije jei tai butu normali programa na bet esme turetu buti aiski)

 

Entry point:


   class Program
   {
       private static Validation validation = new Validation();
       private static XmlLogger xmlLogger = new XmlLogger(validation);
       private static TextLogger textLogger = new TextLogger(validation);

       static void Main(string[] args)
       {
           Console.WriteLine("Enter name:");
           var name = Console.ReadLine();

           Console.WriteLine("Enter password:");
           var password = Console.ReadLine();

           validation.ValidateInput(name, password);

           Console.ReadLine();
       }
   }

 

 

Prideta klase validacijai:


   public class Validation
   {
       public EventHandler<UserCredentialEventArgs> ValidateUserCredentials;

       public void ValidateInput(string name, string password)
       {
           if (!String.IsNullOrWhiteSpace(name) && !String.IsNullOrWhiteSpace(password))
           {
               OnValidateInput(name, password);
           }
       }

       private void OnValidateInput(string name, string password)
       {
           var handler = ValidateUserCredentials;
           if (handler != null)
               handler(this, new UserCredentialEventArgs(name, password));
       }
   }

 

 

EventArgs:


   public class UserCredentialEventArgs : EventArgs
   {
       public UserCredentialEventArgs(string name, string password)
       {
           Name = name;
           Password = password;
       }

       public string Name { get; set; }
       public string Password { get; set; }
   }

 

 

Perdarytos logger klases:


public class XmlLogger
   {
       public XmlLogger(Validation validation)
       {
           this.validation = validation;

           validation.ValidateUserCredentials += (s, e) =>
           {
               WriteXml(e.Name, e.Password);
           };
       }

       private Validation validation;

       public void WriteXml(string name, string password)
       {
           using (var stream = new FileStream("myXmlLog.xml", FileMode.Create))
           {
               var doc = new XDocument(new XElement("UserInfo",
                                       new XElement("UserName", name),
                                       new XElement("AccessCode", password)));

               doc.Save(stream);

               Console.WriteLine("XmlLogger logged your message.");
           }
       }
   }


   public class TextLogger
   {
       public TextLogger(Validation validation)
       {
           this.validation = validation;

           validation.ValidateUserCredentials += (s, e) =>
           {
               WriteText(e.Name, e.Password);
           };
       }

       private Validation validation;

       public void WriteText(string name, string password)
       {
           using (var streamWriter = new StreamWriter("myCustomLog.txt"))
           {
               streamWriter.WriteLine("Login: {0}", name);
               streamWriter.WriteLine("Password: {0}", password);

               Console.WriteLine("TextLogger logged your message.");
           }
       }
   }

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...