Выбор типа внедрения зависимости
Недавно я столкнулся с проблемой, когда мне нужно выбрать тип на основе параметра. Например: класс, используемый для отправки уведомлений, который должен выбрать правильный канал (электронная почта, смс, ...) на основе входного параметра.
Я выгляжу примерно так:
public class NotificationManager
{
IEmail _email;
ISms _sms;
public NotificationManager (IEmail email, ISMS sms)
{
_email = email;
_sms = sms;
}
public void Send(string type)
{
switch(type)
{
case "email":
_email.send;
break;
case "sms":
_sms.send;
break;
}
}
}
Проблема здесь в том, что когда я использую этот вид конструкции, конструктор быстро становится очень большим со всеми различными способами отправки уведомлений.
Мне действительно не нравится это, и это делает юнит-тестирование этой единицы выбора неуправляемым.
Я не могу просто сказатьnew email();
потому что электронная почта типа уведомления будет полагаться на IEmailManager, и это только решит проблему.
Есть ли какая-то модель, которая будет делать то же самое, но лучше и чище?