Quando utilizzare Parametri e Quando non C #

1

Ho un'applicazione con pattern MVVM. Richiede un ID utente e restituisce una tabella con i segnalibri dell'utente. Sto cercando di decidere se è meglio inserire parametri nei metodi del mio modello.

ViewModel:

namespace BookMarks
{
    public class UserProfileVM : Notifier 
    {

        #region Properties

        private int userID;
        public int UserID
        {
            get{return userID;}
            set
            {
                userID = value;
                OnPropertyChange("UserID")
            }
        }

        private DataTable userBookmarks
        public DataTable UserBookmarks
        {
            get{return userBookmarks;}
            set
            {
                userBookmarks = value;
                OnPropertyChange("UserBookmarks")
            }
        }
        #end regiond

        /// <summary>
        /// Use UserID to fill the UserBookmarks Table with a DataTable
        /// </summary>
        private void FillUserBookmarksTable()
        {
            User user = new User();
            user.UserID = CommonValues.UserID;
            UserBookmarks = user.GetUserBookmarks();
        }

        //Constructor
        public UserProfileVM()
        {
            FillUserBookmarksTable();
        }
    }

     public class Notifier : INotifyPropertyChange
     {
         protected void OnPropertyChange(string propertyName)
         {
             if(propertyChanged != null)
             {
                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
             }
         }
     }
}

Modello:

namespace BookMarks
{
    class User
    {
        #region Properties

        public int UserID {get; set;}

        #endRegion


        internal DataTable GetUserBookmarks()
        {

            DataTable dt = new DataTable();
            //create connection
            DB_Admin dbAdmin = new DB_Admin();

            using (SqlConnection conn = dbAdmin.ConntectToDB())
            {
                string query = @"SELECT q.QuestionTitle FROM OTSE_BookMarks b
                                 INNER JOIN OTSE_Questions q on b.UserID = q.UserID and b.QuestionID = q.QuestionID
                                 WHERE b.UserID = @UserID;";

                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    cmd.Parameters.AddWithValue("@UserID", this.UserID);

                    conn.Open();
                    SqlDataAdapter da = new SqlDataAdapter(cmd);

                    da.Fill(dt);
                    conn.Close();
                    conn.Dispose();
                }
            }
            return dt; 
        }
    }
}

La mia domanda riguarda le migliori pratiche. Va bene usare le proprietà di classe nei miei metodi non privati, o dovrei passare i parametri dei miei metodi come:

internal DataTable GetUserBookmarks(int userId){}.

Il modo in cui l'ho scritto al momento sembrava mantenere tutto pulito, in quanto questi metodi dovrebbero essere utilizzati solo con le proprietà delle istanze e non all'esterno del materiale. Fondamentalmente non voglio essere in grado di chiamare userInstance.GetUserBookmarks (randomInt), dovrebbe essere chiamato solo con l'ID utente dell'istanza.

Lo svantaggio è che se qualcun altro sta usando questo codice, quando vanno a chiamare il metodo, potrebbero non sapere di aver bisogno di definire l'ID utente dell'istanza poiché non è passato un parametro. Questo mi è già successo un paio di volte, anche se il bug è abbastanza facile da catturare che non mi sono preoccupato di questo.

Il mio altro pensiero è che dovrei usare Dependency Injection e forzare chiunque stia usando la classe per definire un UserId dopo la costruzione. Questo ancora non risolverà tutto perché alcune proprietà lungo la linea potrebbero aver bisogno di determinati metodi per calcolare o recuperare e non possono essere definiti fino a quando non viene chiamato un metodo diverso. Un esempio potrebbe essere UserRank, che prima avrebbe bisogno di trovare UserScore, che non è qualcosa che può essere iniettato sulla costruzione, ma piuttosto recuperato da un DB dopo la costruzione.

Qualsiasi feedback è apprezzato.

    
posta Mwspencer 21.08.2018 - 00:06
fonte

3 risposte

1

Lo scopo di esporre le proprietà in MVVM è fornire endpoint a cui è possibile collegarsi nell'interfaccia utente. Se non hai bisogno di quelle informazioni nell'interfaccia utente, allora non deve essere una proprietà.

Se hai passato in userId al tuo metodo GetUserBookmarks() potresti renderlo statico. Cioè non è qualcosa che richiede un'istanza dell'oggetto da interrogare.

internal static DataTable GetUserBookmarks(int userId) { /* .... */ }

Tuttavia, una critica alla tua implementazione di MVVM è che non esiste una proprietà denominata Model nel tuo modello di vista. Questa è una delle parti definitive di MVVM, che consente di collegare l'interfaccia utente direttamente al modello, riservando rigorosamente le proprietà in ViewModel per supportare la funzionalità dell'interfaccia utente.

NOTA: il modello di repository è anche un modo utile per separare l'accesso ai dati dal modello stesso.

    
risposta data 20.09.2018 - 15:22
fonte
0

Utilizzerei un modello di repository per eseguire la query sul visualizza il modello e passa l'id utente alla query. Quindi il tuo modello utente potrebbe contenere solo la raccolta di segnalibri che saranno passati al costruttore User.

    
risposta data 21.08.2018 - 14:05
fonte
0

Non c'è niente di sbagliato nell'avere una proprietà come UserId nel modello di vista.

Se è necessario per legare i dati direttamente agli elementi dell'interfaccia utente, rendi public .

Se non è necessario per l'associazione diretta dei dati, rendilo privato.

Guardando il tuo codice, non sembra che sia necessario direttamente, quindi rendilo privato. Se possibile, lo includo come parametro per il costruttore e manterrò l'ID utente come dettaglio di implementazione del modello di visualizzazione.

    
risposta data 20.09.2018 - 15:30
fonte

Leggi altre domande sui tag