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.