Sto cercando il modo migliore per risolvere il seguente problema:
I have three lists of different objects: AppleJuice, OrangeJuice & Juice. All Juice properties exists in AppleJuice & OrangeJuice and I only need these from AppleJuice & OrangeJuice. I can´t change the AppleJuice & OrangeJuice implementations since they come from two unrelated SOAP services. My aim is merge these 3 lists in a Juice lists and then remove the duplicates using a concrete match pattern.
Quale modello sarebbe meglio unire questi diversi oggetti?
Stavo pensando di usare il modello di facciata per i diversi oggetti e poi la strategia per il modello di corrispondenza. Se aiuta, userò C # per implementare il codice.
Ecco cosa ho fatto.
In primo luogo, ho esteso la classe Juice e ho creato 3 metodi di estensione per le classi: AppleJuice, OrangeJuice e Juice.
public class JuiceExtended : Juice
{
public JuiceSourceType JuiceSource { get; set; }
}
public enum JuiceSourceType
{
Apple,
Orange,
Juice,
JuiceWithoutSugar
}
Ho bisogno di conoscere la fonte, perché se c'è un duplicato devo mantenere gli oggetti dal Juice
public static IEnumerable<JuiceExtended> ConvertToExtended(this IEnumerable<AppleJuice> juices)
{
var list = juices.Select((x) => {
var item = new JuiceExtended()
{
JuiceSource = JuiceSourceType.Apple,
//More properties
};
return item;
});
return list;
}
public static IEnumerable<JuiceExtended> ConvertToExtended(this IEnumerable<OrangeJuice> juices)
{
var list = juices.Select((x) => {
var item = new JuiceExtended()
{
JuiceSource = JuiceSourceType.Orange,
//More properties
};
return item;
});
return list;
}
public static IEnumerable<JuiceExtended> ConvertToExtended(this IEnumerable<Juice> juices, JuiceSourceType type)
{
var list = juices.Select((x) => {
var item = (JuiceExtended) x;
item.JuiceSource = type;
return item;
});
return list;
}
Dopo questo, ho creato un JuiceHandler e ho implementato il modello di strategia all'interno dell'algoritmo di dedup
public class JuiceHandler : IJuiceHandler
{
private static IEnumerable<JuiceExtended> _juices;
private JuiceStrategy _strategy;
public JuiceHandler()
{
_juices = new List<JuiceExtended>();
}
public JuiceHandler(JuiceStrategy strategy)
{
_juices = new List<JuiceExtended>();
_strategy = strategy;
}
public void Load(IEnumerable<JuiceExtended> juices)
{
_juices = _juices.Concat(juices);
}
public void SetJuiceStrategy(JuiceStrategy strategy)
{
_strategy = strategy;
}
public IEnumerable<Juice> Transform()
{
if (_strategy == null)
throw new NullReferenceException("The strategy has not been selected.");
else if (_juices.Count() == 0)
return _juices;
return _strategy.Dedup(_juices);
}
}
Considerando le risposte sottostanti, @MainMa, penso che sposterò i metodi di estensione nelle classi parziali WCF, perché ho già classi parziali per WCF quindi, non c'è motivo di metterle in un'altra posizione.