In un'architettura n-layer con MVP nel livello di presentazione, in che modo il livello di presentazione interagisce con il livello aziendale?

0

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?

    
posta Sipo 13.09.2018 - 15:30
fonte

1 risposta

2

Where will I put the information that an id cannot be negative, for example?

La convalida dei dati di input da parte dell'utente viene in genere eseguita in due punti. Effettuate la convalida nell'interfaccia utente per comodità dell'utente, in modo che possano completare correttamente il modulo senza dover effettuare molti round trip sul server. Poi lo fai di nuovo sul lato server perché non ti puoi fidare di ciò che ti invia il client.

How will I wire a "send" button...

Ci sono diversi modi per farlo. In un'applicazione Web, il browser sa come eseguire un POST se si inserisce un pulsante INVIO nel modulo. In un'applicazione desktop questo sta per apparire diverso.

Uno dei motivi per cui il software multi-strato esiste è quello di fornire una superficie comune con la quale i diversi clienti possono comunicare. Se si alza un'API JSON, quell'API funzionerà allo stesso modo se il client è un browser, un'app nativa o un'applicazione desktop.

Architettura di esempio (la tua può variare):

[Database] <--> [Repository] <--> [BLL] <--> [Service/Gateway] <--> [Presenter] <--> [View]
             ^SQL              ^CRUD      ^RPC                   ^JSON/REST       ^EVENTS

| ----------------------- MODEL ---------------------------- | ----- PRESENTER --- | VIEW |

Dove BLL è il livello di logica aziendale / livello di dominio.

    
risposta data 13.09.2018 - 17:38
fonte

Leggi altre domande sui tag