Sono abbastanza nuovo nell'architettura software e sto cercando di capire i concetti di base dell'architettura a livello di n e MVP (in particolare Vista passiva ).
La mia attuale comprensione dell'architettura a livello di n:
Il punto dell'architettura n-layer (o architettura a più livelli se abbiamo una separazione fisica tra i livelli) è di separare la presentazione, la logica aziendale e la gestione dei dati.
Il livello di presentazione è responsabile dell'aspetto visivo del software. È comune implementarlo utilizzando MVC o modelli di progettazione derivati (come MVP nel mio caso).
Il livello aziendale rappresenta il contesto reale tramite modelli di dominio , che sono classi che rappresentano aspetti di questo contesto.
Il livello dati è responsabile della gestione della relazione con il database. Contiene classi e archivi di accesso ai dati.
Le mie attuali conoscenze su MVP ( Vista passiva ):
MVP è un modello di progettazione per il livello di presentazione. Visualizza è responsabile della visualizzazione delle informazioni visive all'utente. Il modello è una classe specifica relativa al dominio che contiene i dati mostrati nella vista. Presentatore è responsabile della gestione di tutte le logiche di presentazione ( if(view.x == y) view.ChangeLabelColor()
) e per il trasferimento dei dati di visualizzazione al modello.
Diciamo che ho un modulo che mostra le informazioni di base dei dipendenti. Le informazioni che voglio mostrare sono il suo ID, il suo nome, il suo stipendio mensile e uno stipendio annuo calcolato. La vista sarà simile a questa:
public partial class EmployeeView : Form
{
private EmployeePresenter presenter;
public short Id
{
set { idTextBox.Text = value.ToString(); }
get { return short.Parse(idTextBox.Text); }
}
public string Firstname
{
set { firsnameTextBox.Text = value; }
get { return firsnameTextBox.Text; }
}
public short MonthlySalary
{
set { monthlySalaryTextBox.Text = value.ToString(); }
get { return short.Parse(monthlySalaryTextBox.Text); }
}
public short YearlySalary
{
set { yearlySalaryTextBox.Text = value.ToString(); }
get { return short.Parse(yearlySalaryTextBox.Text); }
}
public EmployeeView()
{
InitializeComponent();
presenter = new EmployeePresenter(this);
idTextBox.TextChanged += presenter.IdChanged;
firsnameTextBox.TextChanged += presenter.NameChanged;
monthlySalaryTextBox.TextChanged += presenter.MonthlySalaryChanged;
calculateYearlySalaryButton.Click += presenter.CalculateYearlySalary;
}
}
Il modello sarà simile a questo:
class EmployeeModel
{
public short Id { get; set; }
public string Name { get; set; }
public short MonthlySalary { get; set; }
public short YearlySalary { get; set; }
public EmployeeModel(short id, string name, short monthlySalary)
{
Id = id;
Name = name;
MonthlySalary = monthlySalary;
}
}
Il presentatore avrà un aspetto simile a questo:
public class EmployeePresenter
{
// tightly-coupled to avoid overcomplicating the example
private readonly EmployeeView view;
private readonly EmployeeModel model;
public EmployeePresenter(EmployeeView view)
{
this.view = view;
this.model = new EmployeeModel(view.Id, view.Firstname, view.MonthlySalary);
}
public void CalculateYearlySalary(object sender, EventArgs e)
{
var yearlySalary = (short)(model.MonthlySalary * 12);
view.YearlySalary = yearlySalary;
model.YearlySalary = yearlySalary;
}
public void IdChanged(object sender, EventArgs e) => model.Id = view.Id;
public void NameChanged(object sender, EventArgs e) => model.Name = view.Firstname;
public void MonthlySalaryChanged(object sender, EventArgs e) => model.MonthlySalary = view.MonthlySalary;
}
Nel livello aziendale avrei una classe Employee
:
class Employee
{
public short Id { get; private set; }
public string Name { get; private set; }
public short MonthSalary { get; private set; }
// Not necessarily "YearlySalary" because it is
//calculated specifically for the specific View above
...
}
La domanda è questa: supponendo che il mio codice sia a posto (cosa che difficilmente credo che sia), dove dovrei "collegare" il modulo alla logica di business? Dove metterò le informazioni che un ID non può essere negativo, per esempio? Come collegherò un pulsante "Invia" per mappare infine EmployeeModel
in Employee
e registrarlo nel database? Tutti questi riguardano l'interazione tra gli strati. Dove dovrebbe essere e come dovrebbe essere?