Curs Delegates
Curs Delegates
Delegates
- References to methods with a particular param list and return type.
- Associate instance with methods - compatible signature and return type
Why do we need them?
Events -> used to notify other classes or objects when something of
interest occurs.
_mailService.Send(new Mail());
}
}
Problem to solve?
Recompile:
- Process method
public class OrderProcessor - OrderProcessor class
{ - All classed that depends on the class
Redeploy the application
public void Process(Order order)
{
//processing logic
//…
_mailService.Send(new Mail());
_messageService.Send(new Text());
}
}
OrderProcessed
OrderProcessor MailService
OrderProcessor MailService
MessageService
Problem to solve?
public class OrderProcessor
{
public void Process(Order order)
{
//processing logic
//…
OnOrderProcessed();
}
}
public void OnOrderProcessed(object source, EventArgs e)
{
}
orderProcessor.Process(order);
}
}
Code example – Implement event
public class OrderProcessor
{
//1 - define a delegate
//2 - define an event based on the delegate
//3 - raise the event
public void Process(Order order)
{
Console.WriteLine(“Command is being processed”);
Thread.Sleep(3000);
}
}
Code example – Implement event
public class OrderProcessor
{
//1 - define a delegate
public delegate void OrderProcessedEventHandler(object source, EventArgs args);
//2 - define an event based on the delegate
//3 - raise the event
public void Process(Order order)
{
Console.WriteLine(“Command is being processed”);
Thread.Sleep(3000);
}
}
Code example – Define event based on the delegate
public class OrderProcessor
{
//1 - define a delegate Signature of method in subscriber
public delegate void OrderProcessedEventHandler(object source, EventArgs args);
//2 - define an event based on the delegate
public event OrderProcessedEventHandler OrderProcessed;
//3 - raise the event
}
Code example – notify the subscribers
public class OrderProcessor
{
Protected virtual void OnOrderProcessed(Order order)
{
if (OrderProcessed != null)
OrderProcessed(this, EventArgs.Empty);
}
So, if we have notifiers we simply call them
}
Code example – notify the subscribers
class Program
{
static void Main(string[] args)
{ }
}
}
Code example – notify the subscribers
class Program
{
static void Main(string[] args)
{
var order = new Order(){OrderTitle = ”FirstOrder”,OrderNumber=”1”};
var orderProcessor = new OrderProcessor(); //publisher
orderProcessor. OrderProcessed += mailService.OnOrderProcessed; //no call to the method we reference (point to the method)
orderProcessor.Process(order);
}
}
}
Code example – add the new subscriber
class Program
{
static void Main(string[] args)
{
var order = new Order(){OrderTitle = ”FirstOrder”,OrderNumber=”1”};
var orderProcessor = new OrderProcessor(); //publisher
Protected virtual void OnOrderProcessed(Order order) protected virtual void OnOrderProcessed(Order order)
{ {
if (OrderProcessed != null) if (OrderProcessed != null)
OrderProcessed(this, EventArgs.Empty); OrderProcessed(this, new OrderEventArgs() {
} Id = order.OrderNumber, Title = order.OrderTitle });
}
Further extensions
public class MailService
{
public void OnOrderProcessed(object source, OrderEventArgs e)
{
Console.WriteLine("MailService: Sending the email to the administrator for OrderID="
+ e.Id + "with title: "+e.Title);
}