Corretta implementazione a livello MVC5

2

Sono abbastanza nuovo in MVC5 Development e ho letto molto su Layered Design, DI, IoC, ecc ... Sento che sto acquisendo una conoscenza dei concetti, tuttavia quando si tratta di scrivere un buon esempio, lotto. Per fare la mia domanda ho bisogno di impostare una base e qui è quella base, l'obiettivo è creare una nuova squadra:

public class Team
{
    public Guid Id { get; set; }
    public string OwnerId { get; set; }
    public string TeamName { get; set; }
    public virtual ApplicationUser Owner { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        return await manager.CreateIdentityAsync(this, 
            DefaultAuthenticationTypes.ApplicationCookie);
    }
}

public class TeamMember
{
    public Guid Id { get; set; }
    public Guid TeamId { get; set; }
    public string ApplicationUserId { get; set; }
    public virtual Team Team { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

Quindi quanto sopra è fondamentalmente il modello di come apparirà il mio database. Capisco che manchi le osservazioni degli ID generati automaticamente e poche altre cose, ma lascia supporre che funzionerà.

Ora la corretta progettazione a strati MVC5 detta quanto segue (correggimi se ho torto)

Controller:

  1. Controller creerà un "Manager".
  2. Controller chiamerà un metodo nel Manager che restituirà un ViewModel.
  3. Controller passerà questo ViewModel alla View.

Responsabile:

  1. Manager convaliderà e assicurerà che l'utente abbia il permesso di creare un nuovo team
  2. Manager creerà un'istanza vuota di ViewModel
  3. Manager chiamerà i servizi per popolare i dati nel ViewModel

Servizio:

  1. Il servizio utilizzerà la business logic per determinare quale metodo nel livello dati chiamare.
  2. Il servizio
  3. prenderà l'output del metodo in Data (Tipicamente Dto) e lo riporterà al Manager chiamante.

Dati:

  1. Esegui una query e torna indietro IEnumeration of Dtos (se applicabile) al servizio chiamante.
  2. Esegui una query che inserirà i dati in una tabella e restituirà il risultato.

Supponendo che quello che ho scritto sopra sia corretto, allora avrei il seguente codice per creare una nuova squadra:

Controller:

public class TeamController : Controller
{
    public ActionResult Create(string teamName)
    {
        var TeamManager = new TeamManager();
        var result = TeamManager.CreateTeam(teamName);
        if (result == true) return View("TeamCreated");
        return View("TeamNotCreated");
    }
}

Responsabile:

public class TeamManager
{
    ApplicationUser User = ???

    public bool CreateTeam(string teamName)
    {
        var service = new TeamService();
        var team = service.CreateTeam(teamName, User.Id);
        service.CreateTeamMember(team.Id, User.Id);
        return true;
    }
}

Servizio:

public class TeamService
{
    public Team CreateTeam(string teamName, string userId)
    {
        //Call Data query
    }

    public void CreateTeamMember(Guid teamId, string userId)
    {
        //Call Data query
    }
}

Credo che gli esempi sopra illustrino il modello Layered che ho descritto prima. Come tale ho alcune domande che sto cercando di capire ma non ho avuto fortuna, quindi qualsiasi aiuto su questo è più apprezzato!

  1. Come dovrei creare un'istanza di TeamManager? Questo dovrebbe essere fatto tramite iniezione e passato al controllore? Devo creare una nuova istanza di quell'oggetto ogni volta che viene chiamata un'azione sul controller di Team o devo utilizzare l'opzione Singlet di Ninject e memorizzare la cache di quell'oggetto per la prima volta e quindi riutilizzarlo?
  2. Come ottengo ApplicationUser all'interno di TeamManager?
  3. Come faccio a ottenere il DbContext? Capisco che posso creare una nuova istanza e chiamare qualsiasi metodo, ma qual è il modo corretto? Deve essere memorizzato nella cache passato ai dati attraverso il TeamManager? Ha bisogno di essere creato ogni volta, se sì dove?

Non sono riuscito a trovare nessun semplice esempio online, tutto ciò che ho trovato sopra mi complica e mi confonde ancora di più.

    
posta Bojan 22.03.2016 - 18:49
fonte

2 risposte

1

Non esiste una definizione di MVC5 Layered Design , spetta a te inventare il design per te. Non è necessario disporre di un livello Manager per semplici operazioni di recupero dei dati.

  1. How should I be instantiating the TeamManager? Should this be done via injection and passed in to the controller? Should I create a new instance of that object every time any action on the Team controller is called or should I using Ninject singleton option and cache the creation of that object for first time and then reuse it?

Devi usare iniezione di dipendenza . Ci sono molti contenitori come Autofac, Ninject per farlo.

How do I get the ApplicationUser inside TeamManager?

È possibile utilizzare l'iniezione di dipendenza per iniettare l'utente dell'applicazione.

How do I actually get the DbContext? I understand I can create a new instance and just call whatever the method, but what is the correct way? Does it need to be cached passed in to data all the way through the TeamManager? Does it needs to be created every time, if so where?

Avvolgi DBContext in un'interfaccia e utilizza il contenitore DI per iniettarlo dove necessario.

Questo è uno degli esempi che ho fatto per MVC5, puoi avere un'occhiata a come viene usato DI.

    
risposta data 21.06.2016 - 05:24
fonte
0

Diamo un'occhiata ad alcune definizioni dal punto di vista centrico di Microsoft per MVC.

Modello

Questo è il posto dove costruisci i tuoi oggetti dati. La fonte potrebbe essere un database, un altro sito Web, alcuni feed di dati, ecc. Questo è il livello in cui si comunica con il meccanismo di archiviazione. Il modello può eseguire la convalida dei dati prima che vengano memorizzati.

Visualizza

Qui è dove costruisci i tuoi oggetti di presentazione, l'interfaccia utente. Questi oggetti saranno trasformati in HTML prima di essere inviati ai tuoi utenti. Questo è il modo in cui il tuo utente interagisce con la tua applicazione. Quando l'utente fa clic su un pulsante, View effettua una chiamata al Controller per elaborare l'azione.

Regolatore

Questo è il punto in cui crei la colla della tua applicazione. Un controller semplice non può fare altro che dire alla vista di spostare qualcosa sulla pagina. Un controllore più complicato può eseguire l'autenticazione, l'autorizzazione, passare i dati a un modello per la memorizzazione (o ottenere dati da uno) o un numero qualsiasi di attività aggiuntive. Questo è anche il punto in cui la tua applicazione risponderà alla maggior parte delle azioni eseguite dall'utente nella Vista.

Per ulteriori dettagli sull'interazione concettuale tra i livelli, dai un'occhiata a Model-View-Controller: l'utente interagisce con la vista o con il controller?

    
risposta data 23.03.2016 - 00:46
fonte

Leggi altre domande sui tag