Прежде всего, я часто использую шаблоны стратегий или шаблонных методов, поскольку вы используете динамическую c диспетчеризацию или полиморфизм, и вы в основном избавляетесь от блоков if-else. Я имею в виду, что вы помещаете эту логику c в одно место, чтобы не создавать if-элементы, которые разбросаны по нескольким местам. Для дальнейшего изучения вы можете сравнить их с функциями более высокого порядка в функциональном программировании.
public interface IReminderStrategy
{
Task GenerateReminders(string executedBy);
}
public class InviteReminder : IReminderStrategy
{
private IInterfaceA _a;
private IInterfaceB _b;
public InviteReminder(IInterfaceA a, IInterface b){
_a = a; _b = b;
}
public Task GenerateReminders(String executedBy) {
_a.doSomething;
_b.doSomething;
//do invite reminder specific actions here.
}
}
public class BookingReminder : IReminderStrategy
{
private IInterfaceA _a;
private IInterfaceB _b;
public BookingReminder(IInterfaceA a, IInterface b){
_a = a; _b = b;
}
public Task GenerateReminders(String executedBy) {
_a.doSomething;
_b.doSomething;
//do booking reminder specific actions here.
}
}
public static class ReminderFactory {
//If there will be no DI then remove injects and static and instantiate the object with dependencies.
@Inject
private readonly IInterfaceA _a;
@Inject
private readonly IInterfaceB _b;
/* made the class as static so as you said we will be using a DI container.
public ReminderFactory(IInterfaceA a, IInterfaceB b) {
_a = a;
_b = b;
}
*/
public IReminderStrategy getReminder(String messageType) {
switch case(messageType)
{
IReminderStrategy strategy;
case "invite":
strategy = new InviteReminder(_a, _b)
break;
case "book":
strategy = new BookingReminder(_a, _b)
break;
}
}
}
1) создать и передать стратегию (для педагогических целей, т.е. для наглядной иллюстрации.)
затем где-то и на шаг раньше в клиенте:
IReminderStrategy reminderStrategy = ReminderFactory.getReminder("invite");
shopService.shop(reminderStrategy);
наконец в клиенте:
public class ShopService {
public void shop(IReminderStrategy reminderStrategy) {
reminderStrategy.GenerateReminders("taha");
}
}
2) или напрямую:
public class ShopService {
public void shop() {
//...
IReminderStrategy reminderStrategy = ReminderFactory.getReminder("invite");
reminderStrategy.GenerateReminders("taha");
//...
}
}
и, возможно, в другом сервисе:
public class TravelService myService() {
public void travel() {
//travel preparation
IReminderStrategy reminderStrategy = ReminderFactory.getReminder("book");
reminderStrategy.GenerateReminders("admin");
//other travel things or maybe do something with the result.;
}
}