Innanzitutto non c'è da tapparsi gli occhi, ho personalmente scritto di peggio!
allora, per avere le idee chiare al 100% avrei bisogno di vedere i lcodice completo ma non so se hai la possibilità di passarmelo qui o via mail (trovi contatti nel mio profilo o sul mio blog)
comunque penso che il problema sia questa parte qua, nel model:
List<CertificationViewModel> viewModel = await baseQuery
.Select(brev => CertificationViewModel.FromEntity(brev))
.ToListAsync();
il CertificationViewModel che utilizzi qua non è istanziato giusto? fai riferimento al metodo statico FromEntity ma non hai dichiarato l'istanza CertificationViewModel? se è così, il problema è che utilizzando il metodo statico senza inizializzare prima la classe, il servizio passato tramite le dependency injection (ICommonData) non sarà inizializzato e quindi va in errore.
un modo per risolvere è creare un altro servizio, un CertificationFactoryService che si occuperà della creazione di un CertificationViewModel e la relativa interfaccia e registrare questo servizio da richiamare nel model.
Interfaccia
public interface ICertificationFactoryService
{
CertificationViewModel FromEntity(Brevetti brevetti);
}
Implementazione dove tieni la logica per la creazione di un CertificationViewModel
public class CertificationFactoryService : ICertificationFactoryService
{
private readonly ICommonData _common;
public CertificationFactoryService(ICommonData common)
{
this._common = common;
}
public CertificationViewModel FromEntity(Brevetti brevetti)
{
return new CertificationViewModel
{
IdBrevetto = brevetti.IdBrevetto,
Categoria = brevetti.Level,
Nbrevetto = common.NumeroBrevetto("123", "owd", 1, 0),
DataRilascio = brevetti.DataBrevetto.ToShortDateString(),
DataScadenza = brevetti.DataScadenza.HasValue ? brevetti.DataScadenza.ToString().Substring(0, 9) : string.Empty
};
}
}
e poi registrazione nel contenitore dei servizi
services.AddTransient<ICertificationFactoryService,CertificationFactoryService >();
a questo punto rimane il richiamare il servizio ICertificationFactoryService all'interno del costruttore del model e sostituire il servizio al metodo statico nel metodo "incriminato" (nel codice seguente l'ho chiamato _myCertificationFactoryService)
List<CertificationViewModel> viewModel = await baseQuery
.Select(brev => _myCertificationFactoryService.FromEntity(brev))
.ToListAsync();
senza il codice completo non ho la certezza che funzioni o che sia la soluzione migliore.. ma è solo la prima che mi è venuta in mente, quindi metto le mani avanti se ti sto facendo perdere del tempo con questa prova ulteriore!
in ogni caso, fammi sapere!
Maurizio