Domande riguardanti la mia applicazione MVC

0

Sto imparando .net MVC mentre sto sviluppando una semplice lista di parole - Eg. Quando impari una nuova lingua e crei un elenco di parole correlate a un determinato argomento.

Non penso di seguire le regole o le buone pratiche dell'architettura MVC.

  1. Non mi sembra giusto passare il modello completo alla vista, che contiene anche dei metodi. Penso che dovrebbero essere solo proprietà. Devo creare un ViewModel o un repository o entrambi?
  2. I modelli dovrebbero contenere metodi?
  3. I repository dovrebbero contenere metodi?
  4. Se i modelli contengono metodi, il repository equivalente non dovrebbe e vice-versa?
  5. Posso chiamare a catena? Per esempio. ListModel listModel = new ListModel(); listModel.GetListById(listId).SetOwnerId(222).save(); ?

Il mio ListModel.cs :

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using Dapper;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace WordList.Models
{
    public class ListModel : BaseModel
    {
        public int listId { get; set; }
        [Required(ErrorMessage = "Name is required.")]
        public string name { get; set; }
        [Required(ErrorMessage = "Description is required.")]
        public string description { get; set; }
        [Required(ErrorMessage = "Language is required.")]
        public string language { get; set; }
        public int ownerId { get; set; }
        public DateTime date_created { get; set; }
        public DateTime date_updated { get; set; }

        public List<ListModel> GetAllLists()
        {
            using (MySqlConnection connection = new MySqlConnection(this.connStr))
            {
                return connection.Query<ListModel>("SELECT * FROM projectx.lists").AsList();
            }
        }

        public ListModel GetListById(int _listId)
        {
            using (MySqlConnection connection = new MySqlConnection(this.connStr))
            {
                return connection.Query<ListModel>("SELECT * FROM projectx.lists WHERE listId = @listId",
                    new {listId = _listId}
                ).FirstOrDefault();
            }
        }
    }
}

Ecco il mio WordModel.cs :

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using Dapper;
using System.ComponentModel.DataAnnotations;

namespace WordList.Models
{
    public class WordModel : BaseModel
    {
        public int wordId { get; set; }
        public string listId { get; set; }
        [Required(ErrorMessage = "word is required.")]
        public string word { get; set; }
        [Required(ErrorMessage = "Description is required.")]
        public string description { get; set; }


        public List<WordModel> GetWordsByListId(int _listId)
        {
                //this.connStr comes from the BaseModel
                using (MySqlConnection connection = new MySqlConnection(this.connStr))
                {
                    return connection.Query<WordModel>("SELECT * FROM projectx.words WHERE listId = @listId", 
                        new { listId = _listId }
                    ).AsList();
                }

        }
    }
}

Ecco la mia azione nel controller che richiama il modello:

public ActionResult Index(int listId)
{
    ListModel listModel = new ListModel().GetListById(listId);
    if (!String.IsNullOrEmpty(listModel.name))
    {
        ViewData["ListName"] = listModel.name;
        ViewData["ListDescription"] = listModel.description;
        WordModel wordModel = new WordModel();
        return View(wordModel.GetwordsByListId(realId));
    }
    else
    {
        ViewData["Message"] = "List doesn't exist";
        return View();
    }
}
    
posta Cornwell 15.07.2016 - 12:26
fonte

1 risposta

4
  1. Sì, la tua sensazione è buona. Non è giusto avere questi metodi all'interno di Model.

    1 bis. I modelli dovrebbero contenere solo proprietà (secondo me).

    1 ter. I metodi relativi ai dati come il recupero di SQL devono essere incapsulati all'interno dei repository. Lo schema del deposito aiuta a sradicare le connessioni del database che stiamo usando. Dice che hai dozzine di modelli come questo, e un giorno decidi di usare SQL Server invece di MySQL o di usare EntityFramework, è meglio cambiarlo in 1 posto.

    1 quater. L'uso di ViewModels consiste nel contenere informazioni pronte per la visualizzazione, quando i modelli molto probabilmente riflettono solo il tuo database. Prendi ad esempio, supponi di voler differenziare le parole in base a quanto sono popolari in un determinato argomento (le parole più popolari saranno stilizzate come verdi, parole comuni gialle e rare parole rosse); avresti una proprietà chiamata "Popolarità". In tal caso, il tuo WordModel avrà una popolarità come int, quando WordViewModel avrà una proprietà ColorType, che viene tradotta dalla popolarità di Controller. Alcuni amano avere Models e ViewModels allo stesso tempo, alcuni creeranno ViewModels solo quando necessario. È la tua chiamata.

  2. No.

  3. Sicuramente sì. Tutti i metodi precedenti (GetAllLists, GetListById, GetWordsByListId, ecc.) Dovrebbero essere i metodi del repository.

  4. È sempre Model-no, Repo-yes. Non viceversa.

  5. IMO, le chiamate a catena dovrebbero essere utilizzate in casi molto speciali; se non sei sicuro quando usarlo, ti consiglio di non utilizzarlo affatto. Il tuo esempio è un caso in cui NON è possibile utilizzare la chiamata a catena. Rende il tuo codice vulnerabile ai casi limite e il debugging è un inferno (pensa a una piccola riga in una qualsiasi delle funzioni concatenate lancia un'eccezione, saprai subito dove si trova?).

Per riassumere, ti invito a guardare questo video di base sul modello di repository: link

    
risposta data 18.07.2016 - 08:17
fonte

Leggi altre domande sui tag