Come sempre sono venuto qui per chiedere un po 'di luce in un problema di design che sto affrontando.
Ho un sistema che emette alcune notifiche:
- PackageReceivedNotification
- PackageSentNotification
- DisccountAvailableNotification
- Altro in futuro
Voglio memorizzarne il testo nel DB in più lingue (immagina inglese e spagnolo)
Ogni notifica ha un metodo che restituisce una rappresentazione formattata della notifica mescolando un testo di base (recuperato dal DB) e alcune informazioni recuperate dall'oggetto associato a ciascuna notifica:
public interface INotification
{
string GetMessageToSend(string languageCode);
}
//Example of implementation
public class DisccountAvailableNotification:INotification
{
Disccount Disccount{get; private set;}
Dictionary<string,string> TranslatedNotificationTexts{get; private set;}
public DisccountAvailableNotification(Disscount disccount)
{
Disccount = disccount;
TranslatedNotificationTexts= getFromDatabase();
}
public string GetMessageToSend(string languageCode)
{
//Retrieved from database imagine :"{0} has a discount of {1}"
string translatedNotText= TranslatedNotificationTexts[languageCode]
return string.Format(translatedNotText, Disccount.name, Disccount.percentage);
}
}
Penso che un design di codice che mi consente di notificare la notifica passando come parametro nel costruttore il tipo concreto di classe a cui è associato, ad esempio un
- DisccountAvailableNotification richiede un'istanza di Disccount per essere generata
- PackageSentNotification richiede un'istanza del pacchetto per essere generata
Il mio codice desiderabile sarà un notificacionprovider "generico" che mi permette di generare inotori ma di essere sicuro del compilatore, quindi è abbastanza intelligente da dirmi quale tipo di oggetto ha bisogno di creare la notifica, qualcosa del genere:
INotification notification1= NotificationProvider
.GenerateNotification<DisccountNotification>.(new Disccount("90%"));
INotification notification2= NotificationProvider
.GenerateNotification<PackageSentNotification>(new Package("Socks","19$"));
Sarà possibile con un design flessibile che consenta nuovi tipi di notifiche in futuro senza troppe modifiche? Quale sarebbe il miglior approccio al design?