Ipotesi:
- Applicazione ASP.NET MVC 3 minimalista per l'invio di email in cui la vista rappresenta il contenuto di un'email.
- Oltre 500 tipi di email. Non mi piacerebbe avere più di 500 azioni nel mio controller corrispondenti a ciascun tipo di email.
- I tipi di email sono memorizzati in un enum chiamato MailType, quindi potremmo avere:
- MailType.ThankYouForYourPurchase, MailType.OrderShipped, ecc.
- Il nome della vista è uguale al nome mailType:
- MailType.OrderShipped avrebbe una vista corrispondente: OrderShipped.cshtml
- Alcune viste utilizzerebbero direttamente un'entità mentre altre utilizzerebbero un ViewModel.
Quindi, dato che ho più di 500 tipi di email, qual è il modo migliore / pattern per organizzare la mia applicazione?
Ecco cosa stavo pensando,
Controller:
public class MailController : Controller
{
public ActionResult ViewEmail(MailType mailType, int customerId)
{
string viewName = mailType.ToString();
var model = _mailRepository.GetViewModel(mailType, customerId);
return View(viewName, model);
}
public ActionResult SendEmail(MailType mailType, int customerId)
{
...
}
}
Classe MailRepository:
public class MailRepository
{
private readonly CustomerRepository _customerRepository;
private readonly OrderRepository _orderRepository;
//pretend we're using dependency injection
public MailRepository()
{
_customerRepository = new CustomerRepository();
_orderRepository = new OrderRepository();
}
public object GetViewModel(MailType mailType, int customerId)
{
switch (mailType)
{
case MailType.OrderShipped:
return OrderShipped(customerId);
case MailType.ThankYouForYourPurchase:
return ThankYouForYourPurchase(customerId);
}
return _customerRepository.Get(customerId);
}
public Order OrderShipped(int customerId)
{
//Possibly 30 lines to build up the model...
return _orderRepository.GetByCustomerId(customerId);
}
public Customer ThankYouForYourPurchase(int customerId)
{
return _customerRepository.Get(customerId);
}
}
Ma in questo modo la mia classe MailRepository diventerà estremamente grande a meno che non lo renda in qualche modo ...