C # EntityFramework 6 DbContext e servizio dati con iniezione delle dipendenze

0

Sto rifattorizzando un'applicazione che raccoglie e visualizza i dati di misurazione che sono memorizzati in un database. Attualmente ho un'interfaccia calle IMeasurementsDataService e un'implementazione MeasurementsDataService

public interface IMeasurementsDataService
{
  IEnumerable<MeasurementResult> GetResults(DateTime rangeStart, DateTime rangeEnd);
  void AddResult(MeasurementResult result);
  void ModifyResult(MeasurementResult result);
  void DeleteMeasurement(MeasurementResult result);
}

Poiché il servizio non viene utilizzato in modo continuo, ogni metodo crea un'istanza di DbContext e lo elimina quando viene sottoposto a un'operazione. Ad esempio il metodo add si presenta così:

public void AddResult(MeasurementResult newResult)
{
  using (var context = new MeasurementsDbContext())
  {
    ...
    context.SaveChanges();
  }
}

Sto iniettando un'istanza singleton di MeasurementsDataService in alcuni ViewModels e creo Mock di IMeasurementsDataService per i test unitari.

Ma ora voglio aggiungere un nuovo metodo a IMeasurementsDataService e voglio anche aggiungere test unitari. Fino ad ora ho utilizzato un database locale del server SQL che ho sempre cancellato e pre-compilato con alcuni dati prima di ogni test unitario e poi ho usato il MeasurementsDbContext reale per eseguire le operazioni di test. Ma questo approccio richiede molto tempo e preferirei anche prendere in giro DbContext e fornire alcuni dati direttamente dal codice. Ma quando cambio il codice e inserisco DbContext in MeasurementsDataService , DbContext vive tutto il tempo di vita dell'applicazione che considero una cattiva pratica. Creare una nuova istanza di IMeasurementsDataService ogni volta che ne ho bisogno, inoltre, non sembra una soluzione perché ho perso la capacità di testare correttamente i ViewModel.

Sto pensando di fornire un qualche tipo di MeasurementDataServiceFactory a ViewModels, che crea istanze del servizio dati quando richiesto e può essere deriso per fornire un servizio dati diverso per i test. Il servizio dati può avere un DbContext per istanza.

Pensi che questa sia una buona soluzione o qualcuno ha una soluzione migliore e più semplice per iniettare servizi dati per visualizzare modelli e contesti nei servizi dati senza avere un DbContext che resista all'intero runtime dell'applicazione?

    
posta Buchter 23.08.2017 - 14:33
fonte

0 risposte