J'essaie de comprendre les événements de domaine. Disons que j'ai un objet client et qu'il déclenche l'événement OnCustomerInserted. Je souhaite que mon cours de service de messagerie électronique s'abonne à cet événement afin que chaque fois que l'événement est déclenché, un e-mail est envoyé.Comprendre les événements de domaine
public class Customer
{
public delegate void CustomerInsertedHandler();
public event CustomerInsertedHandler CustomerInserted;
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public void OnCustomerInserted()
{
if(CustomerInserted != null)
{
CustomerInserted();
}
}
}
Et voici le CustomerRepository:
public class CustomerRepository
{
public void Add(Customer customer)
{
// add the customer
customer.Id = 2;
if(customer.Id > 0)
{
// raise the event!
}
}
}
Enfin, voici la classe simple EmailService:
public class EmailService
{
public EmailService()
{
}
public void Send()
{
Console.WriteLine("Email has been sent!");
}
}
MISE À JOUR:
encore le code ci-dessous est un peu laid!
public class CustomerRepository
{
public delegate void CustomerInsertedHandler(Customer newCustomer);
public event CustomerInsertedHandler CustomerInserted;
public void OnCustomerInserted(Customer newCustomer)
{
if (CustomerInserted != null)
CustomerInserted(newCustomer);
}
public void Add(Customer customer)
{
// add the customer
customer.Id = 2;
if(customer.Id > 0)
{
var emailService = new EmailService();
CustomerInserted += emailService.Send;
// raise the event!
OnCustomerInserted(customer);
}
}
}
Je mis à jour mon dépôt et utilise StructorMap de créer une instance du référentiel
public class CustomerRepository : ICustomerRepository
{
public delegate void CustomerInsertedHandler(Customer newCustomer);
public event CustomerInsertedHandler CustomerInserted;
private IEmailService _emailService;
public CustomerRepository(IEmailService emailService)
{
_emailService = emailService;
CustomerInserted += _emailService.Send;
}
Le code est toujours pas bon puisque maintenant le constructeur CustomerRepository est se bondé. Le EmailService est propre comme suit:
public class EmailService : IEmailService
{
public EmailService()
{
}
public void Send(Customer customer)
{
Console.WriteLine("Email Sent!");
}
}
Déplacez le code d'abonnement _out of_ 'CustomerRepository' et placez-le dans le constructeur' EmailService'. –