Sto pensando all'implementazione del comando / modello di query e ho la seguente soluzione:
Interfaccia per le query:
public interface IQuery<TResult, TArg>
where TResult: class
where TArg: class
{
TResult Execute(TArg query);
}
Implementazione:
public class TreesTransQuery : IQuery<List<Trans>, GetTree>
{
private readonly DatabaseContext _context;
public TreesTransQuery(DatabaseContext context)
{
_context = context;
}
public List<Trans> Execute(GetTree query)
{
return _context.Trans
.Where(x =>
_context.Trees
.Where(z => z.Id == query.TreeId)
.Union
( _context.Trees
.Where(z => z.Id == query.TreeId)
.SelectMany(z => z.Children)
).Select(z => z.Id)
.Any(q => x.Entity == $"{q}tree"))
.ToList();
}
}
Esecuzione (nel livello di servizio)
var result = new TreesTransQuery(_context).Execute(query);
dove "query" è un'istanza della classe GetTree che è di seguito:
public class GetTree
{
public int TreeId { get; set; }
}
Funziona bene, ma non sono sicuro che questa soluzione sia corretta. Quali dovrebbero essere esattamente le classi GetTree e TransTreeQuery?
Suppongo che TransTreeQuery sia l'implementazione della query, ma che dire di GetTree? Questa classe rappresenta i parametri per la query, quindi come dovrei chiamare questa classe? GetTreeParams? TreeTransQueryParams?
TreeTransQuery - implementazione della query
GetTree -?