Interfaccia (contratto), Generics (universalità) e metodi di estensione (facilità d'uso). È un design giusto?

0

Sto provando a progettare un semplice framework di conversione basato su questi requisiti:

  1. Tutti gli sviluppatori devono seguire un insieme predefinito di regole da convertire dall'entità di origine all'entità di destinazione
  2. Alcune norme generali dovrebbero poter essere applicate in un luogo centrale, senza interferenze con il codice degli sviluppatori
  3. Sia la creazione di convertitori che l'uso di classi di convertitori dovrebbero essere semplici

Per risolvere questi problemi nel linguaggio C #, mi è venuto in mente un pensiero. Lo sto scrivendo qui, sebbene non si compili affatto. Ma supponiamo che C # compili questo codice:

Creerò un'interfaccia generica chiamata IConverter

public interface IConverter<TSource, TTarget>
    where TSource : class, new()
    where TTarget : class, new()
{
    TTarget Convert(TSource source);

    List<TTarget> Convert(List<TSource> sourceItems);
}

Gli sviluppatori implementerebbero questa interfaccia per creare convertitori. Ad esempio:

public class PhoneToCommunicationChannelConverter : IConverter<Phone, CommunicationChannle>
{
    public CommunicationChannel Convert(Phone phone)
    {
        // conversion logic
    }

    public List<CommunicationChannel> Convert(List<Phone> phones)
    {
        // conversion logic
    }
}

E per semplificare l'utilizzo di questa classe di conversione, immagina di aggiungere static e this parole chiave ai metodi per trasformarli in Metodi di estensione e utilizzarli in questo modo:

List<Phone> phones = GetPhones();
List<CommunicationChannel> channels = phones.Convert();

Tuttavia, questo non viene nemmeno compilato. Con questi requisiti, posso pensare ad altri progetti, ma a loro manca un aspetto. O l'implementazione diventerebbe più difficile o caotica e fuori controllo, o l'utilizzo diventerebbe veramente difficile. Il design è giusto? Quali alternative potrei avere per raggiungere tali requisiti?

    
posta Saeed Neamati 21.08.2014 - 12:26
fonte

2 risposte

4

Potresti semplicemente definire un operatore esplicito per eseguire la conversione direttamente nella classe Phone in questo modo:

public class Phone 
{
     // your Phone props here

     public static explicit operator CommunicationChannel(Phone phone)
     {
          return new CommunicationChannel { PropQ = phone.PropZ };
     }
}

Per utilizzare l'operatore, basta effettuare Phone come CommunicationChannel:

List<Phone> phones = GetPhones();
List<CommunicationChannel> channels = phones.Select(phone => (CommunicationChannel)phone).ToList();
    
risposta data 21.08.2014 - 14:15
fonte
1

Ho dovuto specificare molte conversioni di tipo personalizzato nel mio progetto e ho avuto molto successo usando solo un pezzo di codice dal progetto EmitMapper

Emitmapper: StaticConvertersManager.cs

Puoi semplicemente creare classi con funzioni statiche che hanno un parametro con un tipo e restituiscono un altro tipo e puoi registrarle con questo gestore

Mi ha salvato un sacco di tempo

    
risposta data 22.08.2014 - 11:33
fonte

Leggi altre domande sui tag