Nota: sono sicuro di come pronunciare il titolo
Questo è uno pseudo codice del mio progetto su cui sto lavorando. Per concisione ho omesso alcuni dettagli.
Ho due tipi di classi Consumer. Uno è ereditato dall'altro e fa alcune cose extra.
Consumer ha un thread che esegue una coda di attività.
Ho un IProducer che inoltro. Spara gli eventi, Consumer li ascolta e poi aggiunge i metodi da IDoer alla coda.
Ho avuto un'interfaccia IResultsWriter per scrivere i risultati di IDoer. In questo momento si limita a scrivere su un file (utilizzando CSVHelper) ma vorrei consentire altre opzioni in futuro, quindi l'interfaccia, come REST o SQL ecc.
Sto tentando di mantenere la mia API come dipendente conforme alle iniezioni di dipendenza il più possibile.
Il mio problema è che la mia classe Consumer derivata aggiunge alcune proprietà extra al set di risultati. I set di risultati prodotti da IDoer non vengono modificati. (questi sono aggiunti nel consumatore).
Non sembra che la mia unica opzione sia di eliminare la mia interfaccia e passare una classe concreta diversa a ciascun consumatore. Consumer otterrebbe ResultsWriter e Consumer_WithExtra otterrebbe ResultWriter_WithExtra
C'è un altro approccio che posso prendere in modo da poter mantenere il mio DI di ResultsWriter per consentire altri modi di scrivere in futuro.
public class Main
{
public RunThese()
{
Consumer A = new Consumer(new Producer(), new Doer(), new ResultWriter());
Consumer_WithExtra = new Consumer_WithExtra(new Producer(), new Doer(), new ResultWriter_WithExtra());
}
}
public class Consumer
{
public Consumer(IProducer producer, IDoer Doer, IResultsWriter writer)
{
}
private void DoTriggeredByProducer()
{
write(results);
}
protected virtual void write(List<DoerResult> results)
{
writer.write(results);
}
}
public class Consumer_WithExtra : Consumer
{
public string ExtraSomething {get; set;}
public Consumer_WithExtra(IProducer producer, IDoer doer, IResultsWriter writer) : base (producer, doer, writer)
{
}
private void DoTriggeredByProducer()
{
//** Need to get Extra something to the
write(results)
}
protected override void write(List<DoerResult> results)
{
List<DoerResult_WithExtra> convertedResults =ConvertResults(results)
writer.write(convertedResults);
}
private List<DoerResult_WithExtra> ConvertResults(List<DoerResult> results)
{
List<DoerResult_WithExtra> convertedResults = new List<DoerResult_WithExtra>();
foreach(var r in results)
{
convertedResults.Add(new DoerResult_WithExtra(r) { ExtraProperty = this.ExtraSomething }
}
return convertedResults;
}
}
public class DoerResult
{
public string Name {get; set;}
public int BlahBlah {get; set;}
public int BlahBlah {get; set;}
}
public class DoerResult_WithExtra : DoerResult
{
public string ExtraProperty {get; set;}
}
public interface IResultsWriter()
{
public void write(List<DoerResult> results);
}
public class ResultWriter : IResultsWriter
{
public virtual void write(List<DoerResult> results)
{
//** at a lost here
}
}
public class ResultWriter_WithExtra : ResultWriter
{
public override void write(List<DoerResult> results)
{
//** at a lost here
}
}