• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy ktoś mógłby mi pomóc z eventami?

VPS Starter Arubacloud
0 głosów
437 wizyt
pytanie zadane 9 lipca 2018 w C# przez matmati2003 Użytkownik (620 p.)
Mam problem. Tak jak zaznaczyłem w pytaniu, mam problem ze zrozumieniem eventów w c#. Przerabiam kurs Impact IT (https://www.youtube.com/watch?v=oR8FrGfixC0&t=1347s) ale nie moge tego zrozumieć... Czy ma ktoś jakiś pomysł jak mógłbym to zrozumieć? Z góry dziękuje za odpowiedź.

2 odpowiedzi

0 głosów
odpowiedź 10 lipca 2018 przez Crash182 Gaduła (3,600 p.)
wybrane 10 lipca 2018 przez matmati2003
 
Najlepsza

Hey, podam najprostszy przykład jaki mogę wymyslec, przerób go a jeśli będziesz miał jakieś pytania to pisz.

Zacznijmy od klasy Employee ze niby będziemy tworzyć nowego employee w systemie.

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }

Mam nadzieje ze nie trzeba nic na razie tłumaczyć. 

Teraz powiedzmy ze mamy sobie service - EmployeeService w którym będzie jakaś logika zapisująca tego employee do bazy danych. 

    public class EmployeeService
    {
        public EventHandler<EmployeeCreatedEventArgs> EmployeeCreated;

        public void Create()
        {
            var employee = new Employee
            {
                Id = 1,
                Name = "Tomek",
                Age = 22,
                Email = "Tomek@gmail.com"
            };

            // jakis kod ktory zrobi insert do DB

            EmployeeCreated?.Invoke(this, new EmployeeCreatedEventArgs
            {
                Id = employee.Id,
                Name = employee.Name,
                Age = employee.Age,
                Email = employee.Email
            });
        }
    }

Po kolei co tutaj mamy. Na początku zadeklarowałem EventHandler<T arguments> z moja custom klasa EmployeeCreatedEventArgs, jesli chcesz przesyłać jakieś argumenty to tak to się wlanie robi. Jedyny wymóg to taki ze ta klasa musi dziedziczyć po EventArgs, moja wygląda tak:

public class EmployeeCreatedEventArgs : EventArgs
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }

Po utworzeniu employee i "zapisaniu go w bazie danych" publikuje event z argumentami, najkrótszy i najładniejszy syntax jaki znam wygląda własnie tak:

EmployeeCreated?.Invoke(this, new EmployeeCreatedEventArgs
            {
                Id = employee.Id,
                Name = employee.Name,
                Age = employee.Age,
                Email = employee.Email
            });

W tym wypadku sender to jest EmployeeService wiec używam "this" a argumenty to moja custom class EmployeeCreatedEventArgs.

Później robię np Email service który będzie wysyłał gdzieś mail jeśli nowy employee zostanie utworzony: 

public class EmailService
    {
        public void OnEmployeeCreated(object sender, EmployeeCreatedEventArgs args)
        {

            var id = args.Id;
            var name = args.Name; 
            // etc....


            // wiecej kodu zeby wyslac email, wszystkie parametry jakie potrzebujesz laduja w args...
        }
    }

!Ważne żeby sygnatura obu metod była taka sama! W tym wypadku (object sender, EmployeeCreatedEventArgs args)

I na końcu spinamy wszystko do kupy:

namespace EventsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // moze byc rozniej MVC controler czy cokolwiek....

            // najpierw tworzysz instancje...
            var employeeService = new EmployeeService();
            var emailService = new EmailService();

            // oczywiscie trzeba ustawic relacje events-listeners
            employeeService.EmployeeCreated += emailService.OnEmployeeCreated;

            // teraz jesli odpalisz metode Create() ona na koncu opublikuje event EmployeeCreated 
            // ktory zostanie uslyszany przez EmailSevice i metoda OnEmployeeCreated zostanie wywolana
            employeeService.Create();
        }
    }
}

Jeśli masz jakieś pytania to pisz, postaram się pomoc.

Pozdrawiam

komentarz 10 lipca 2018 przez matmati2003 Użytkownik (620 p.)

Dzięki za tak obszerne wytłumaczenie. zaczynam to powoli rozumieć, ale nadal nie rozumiem kilku rzecz... przerobie twój przykład jeszcze kilka razy  może to zrozumiem. Miłego dnia życzęsmiley

0 głosów

92,979 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,308 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...