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