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:
- Controller creerà un "Manager".
- Controller chiamerà un metodo nel Manager che restituirà un ViewModel.
- Controller passerà questo ViewModel alla View.
Responsabile:
- Manager convaliderà e assicurerà che l'utente abbia il permesso di creare un nuovo team
- Manager creerà un'istanza vuota di ViewModel
- Manager chiamerà i servizi per popolare i dati nel ViewModel
Servizio:
- Il servizio utilizzerà la business logic per determinare quale metodo nel livello dati chiamare. Il servizio
- prenderà l'output del metodo in Data (Tipicamente Dto) e lo riporterà al Manager chiamante.
Dati:
- Esegui una query e torna indietro IEnumeration of Dtos (se applicabile) al servizio chiamante.
- 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!
- 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?
- Come ottengo ApplicationUser all'interno di TeamManager?
- 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ù.