C # Costruttore e privato LINQ ai membri SQL

0

Sto estendendo un'applicazione che ho sviluppato in modo che sia più ampiamente utile per più lavori, piuttosto che per il singolo lavoro per cui l'ho creato. Ci sono un certo numero di tabelle che ottengo da SQL Server con LINQ to SQL. Invece di avere tutti i record dal database popolano l'applicazione, voglio filtrare prima per lavoro. Attualmente i miei viewmodels hanno tutti la stessa costruzione: una serie di ObservableCollections private che ottengono i dati attraverso le classi LINQ to SQL, un costruttore che imposta i comandi di binding (cercando di mettere in pratica il buon MVVM) e quindi la logica. Quindi quello che faccio ora è qualcosa del genere:

partial class MainViewModel : InotifyPropertyChanged
{
    ObservableJobs _oJob = new ObservableJobs(_dataDc);
    public MainViewModel()
    {
        NumRecords.Value = oJob.View.Count;
    }

    public ViewableCollection<Job> oJob
    {
        get { return _oJob; }
    }
    // and then the stuff that the viewmodel takes care of follows
}

public class ViewableCollection<T> : ObservableCollection<T>
{
    private ListCollectionView _View;
    public ListCollectionView View
    {
        get
        {
            if (_View == null)
            {
                _View = new ListCollectionView(this);
            }
            return _View;
        }
    }
}

Mi sembra che _oJob venga compilato prima dell'esecuzione del costruttore, poiché a NumRecords.Value vengono assegnati i record effettivi dal database. È meglio dichiarare al di fuori del costruttore e assegnare all'interno del costruttore, o è solo una questione di tempo / sequenza quando le cose accadono? Nella mia prossima fase penso di dover controllare il momento in cui le cose vengono caricate meglio, in modo da minimizzare il numero di record trasferiti da SQL Server.

Se provo a dichiararlo in questo modo ottengo un'eccezione, l'eccezione interna dice "Il valore non può essere nullo. Origine del nome del parametro".

    ObservableJobs _oJob;// = new ObservableJobs(_dataDc);
    public MainViewModel()
    {
        _oJob = new ObservableJobs(_dataDc);
        NumRecords.Value = oJob.View.Count;
    }

Come faccio a controllare come istanzio le raccolte osservabili in modo che possa impostare un jobID (o passarne uno al costruttore insieme al datacontext) e filtrare le query?

Ecco la classe ObservableJobs:

class ObservableJobs: ViewableCollection<Job>
{
    public ObservableJobs(DocControlDC dataDc)
    {
        foreach (Job j in dataDc.Jobs)
        {
            this.Add(j);
        }
    }
}
    
posta Paul Gibson 07.04.2015 - 19:52
fonte

1 risposta

0

Perché non fare DI invece di rianimare l'oggetto direttamente in quella classe? In questo modo non devi preoccuparti del problema originale perché verrà inizializzato per te e quindi verrà passato in .

Inoltre, sarebbe molto più semplice testare il tuo modello di visualizzazione.

Ma per rispondere alla tua domanda originale. Nel caso in cui si debba inizializzare all'interno della classe, direi:

È una questione di efficienza.

Ecco la regola generale che passo:

Se la proprietà che viene istanziata sarà ripetuta in più costruttori allo stesso modo , la estraggo e inizializza in alto . È più facile vedere in alto quando stai cercando di capire anche la classe (o avere un costruttore privato che il resto del sovraccarico chiama come parte dell'inizializzazione - questo però crea una quantità inutile di codice duplicato - averlo in cima è solo una fodera).

Se verrà inizializzato in modo diverso per costruttore, lo tengo all'interno del costruttore, che è autoesplicativo.

    
risposta data 07.04.2015 - 20:17
fonte

Leggi altre domande sui tag