Lasciatemi abbozzare la situazione:
- Ho più utenti, con determinate proprietà (2 enumerazioni)
- Per ogni utente ho bisogno di recuperare i dati, per alcuni con alcuni filtri di base, per alcuni filtri estesi (= filtro di base + filtro aggiuntivo). Mi piacerebbe farlo non separato per ogni utente, ma preferirei raggruppare gli utenti e farlo in due query.
- Per ogni utente, ho bisogno di filtrare i dati in base ai valori dell'enumerazione. sempre devo fare
GetFirstData()(metodo che dipende dal primo enum),GetLastData()(metodo che dipende dal secondo enum),CheckData()(dipende da entrambe le enumerazioni).
Ho esaminato il Pattern di strategia , ma sembra che sia più progettato per implementare un comportamento. Voglio combinare i miei comportamenti per evitare di creare le combinazioni tra tutti GetFirstData e GetLastData , c'è qualche schema per farlo meglio? Ho pensato solo a usare 2 delegati e assegnare i metodi corrispondenti in base ai valori delle enumerazioni . Questo sarebbe il modo più pulito?
Piccolo esempio di cosa intendo:
public class User
{
public Enum1 FirstEnum {get; set;}
public Enum2 SecondEnum {get; set;}
...
}
public IEnumerable<Data> Filter(int userId, Expression extraFilter)
{
var data = GetData(userId);
if(extraFilter != null)
data = data.Where(extraFilter);
return data;
}
public Data GetFirstData(IEnumerable<Data> data);
public Data GetLastData(IEnumerable<Data> data);
public bool CheckData(IEnumerable<Data> data);
Il mio endresult potrebbe fare qualcosa del genere:
public class EndResult
{
public Data FirstResult {get; set;}
public Data SecondResult {get; set;}
public Func<IEnumerable<Data>,Data> GetFirstData {get; set;}
public Func<IEnumerable<Data>,Data> GetLastData {get; set;}
public bool ExtendeFiltering {get; set;}
public EndResult(User user)
{
switch(user.enum1)
{
case: GetFirstData = specificFunction;
ExtendedFiltering = true;
...
}
//Second for GetLastData;
}
public void Execute()
{
GetData();
CheckData();
GetFirstData();
GetLastData();
}
}
Modifica: per i futuri lettori che sono curiosi, non ho usato i delegati (almeno non direttamente). Ho creato 2 interfacce IFirst e ILast con un metodo corrispondente. Nel mio metodo di creazione statico definito sulla mia classe di processore, eseguo la logica per creare un'istanza di tali interfacce in base a determinate condizioni. Il motivo per cui ho lasciato il percorso usando direttamente i delegati è perché ho scoperto che avevo bisogno di più parametri rispetto a User per alcuni di essi. Così ho fatto ricorso a diverse implementazioni basate sui parametri che ho bisogno nel costruttore di quelle classi.