Miglior schema di progettazione per Notification System = Come gestire più lingue ed elementi

0

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

  1. DisccountAvailableNotification richiede un'istanza di Disccount per essere generata
  2. 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?

    
posta Badulake 25.05.2018 - 18:55
fonte

1 risposta

1

Idealmente avresti un metodo che prende esplicitamente un parametro generico e ne deduce l'altro, che non penso sia direttamente possibile in C #, anche se mi piacerebbe sbagliarmi.

Se non ti dispiace un'interfaccia meno carina, puoi farlo in modo abbastanza semplice:

public interface IProvidedNotification<T> : INotification
{
    void Initialize(T data);
}

public interface INotificationProvider
{
    INotification GenerateNotification<TN, TD>(TD data) where TN : IProvidedNotification<TD>;
}

Ma dovresti chiamarlo con entrambi i parametri:

var note = NotificationProvider.GenerateNotification<PackageSentNotification,Package>(new Package("Socks","19$"));
    
risposta data 25.05.2018 - 20:21
fonte