Come implementare la business logic con i servizi Web?

0

Sono un po 'confuso su come la logica aziendale dovrebbe essere implementata usando i servizi web. Ad esempio, pensa a un'applicazione di gestione dell'istruzione. Ci sono semplicemente studenti, insegnanti e corsi. Ora, il lato server dell'applicazione può fornire l'operazione getStudents tramite un'interfaccia WSDL. Questa operazione restituisce l'elenco di Student elementi.

Secondo il paradigma orientato agli oggetti, una classe dovrebbe avere una certa responsabilità. Dovrebbe nascondere il suo stato interno e uno può raggiungere i suoi dati solo usando le sue operazioni. Ma sul lato client una classe Student è solo una borsa dati. Non c'è logica quindi nessuna responsabilità qui.

Un altro problema è che non esiste una semantica di riferimento sul lato client. Normalmente, uno studente è associated with di corsi. Ma nell'implementazione un Student object has lista di Course oggetti o potrebbe contenere qualche identificatore per i corsi.

Infine, l'utilizzo di servizi Web (tramite WSDL) sembra conveniente per accedere ai dati remoti ma non per eseguire la logica aziendale da remoto. Ho ragione, o mi manca qualcosa di importante sui servizi web?

Modifica

Il mio intento è implementare la logica di business sul lato server. Ad esempio, supponiamo che abbia una classe sul lato server come quella:

class Student
{
  //some properties like name, courses, etc.
  double calculateGPA(); //calculates average grade using course credits.
  //other operations like getName()
}

class SchoolRepository
{
  List<Student> getStudents();
  List<Course> getCourses();
  //other operations
}

Ora, posso creare WSDL che fornisce l'interfaccia SchoolRepository . Quindi, il cliente ottiene la lista degli studenti. Ma non possono raggiungere direttamente la logica aziendale implementata in calculateGPA() . Posso fornire un'altra interfaccia WSDL per questo. Ma rompe l'incapsulamento dei dati e del comportamento.

    
posta Q Q 03.01.2017 - 10:32
fonte

3 risposte

2

Il tuo esempio getStudents () è ciò che ti confonde. Mi rendo conto che hai selezionato questo come un semplice esempio, ma questo è il problema. È così semplice nella tua mente che non vedi alcuna logica applicata.

Presa alla lettera, restituirai tutti gli studenti che sono entrati nel sistema dall'inizio del tempo. C'è davvero bisogno di questo? Questo include gli studenti che si sono iscritti, ma hanno lasciato la scuola prima di finire una lezione? Tutti gli studenti devono essere accettati? Si sono laureati?

Una volta che inizi a considerare il vero vantaggio della tua applicazione (non si tratta solo di un elenco di studenti e dei loro corsi), vedrai dove è necessaria la logica. Ecco alcuni esempi:

  • Iscrivi uno studente in una classe, ma controlla i prerequisiti, le classi in conflitto, la disponibilità, l'approvazione della facoltà, ecc.
  • Espellere uno studente - creare un flusso di lavoro e un processo di notifica per ottenere tutte le approvazioni necessarie.
  • GetFullTimeStudentsByGradingPeriod (gradingperiod) - calcola il numero di ore di credito iscritte durante il periodo indicato per determinare lo stato a tempo pieno.
  • AssignStudentCourseGrade (studente, corso) - Verifica se sei iscritto e l'utente è autorizzato a inserire voti per questo corso.

Se la tua applicazione non è altro che una "skin" su un database, non hai davvero molta logica di cui preoccuparti, ma penso che stai facendo un sacco di supposizioni che imparerai presto richiederà logica da eseguire dal servizio e non dall'applicazione che utilizza il servizio.

    
risposta data 03.01.2017 - 16:14
fonte
1

È necessario progettare un'architettura e decidere la responsabilità generale del front-end e del back-end. Ad esempio:

  • Il front-end gestisce la presentazione dei dati e le interazioni con l'utente. Gli oggetti non sono responsabili del comportamento: sono solo oggetti di trasferimento dati da visualizzare. Alla fine potrebbero agire come proxy per l'oggetto server.
  • Il back-end gestisce l'oggetto dominio e la persistenza dei dati. Il livello di servizio fornisce una facciata per l'esposizione dei servizi delle applicazioni sul Web.

In questo scenario avresti servizi come getStudent(id) , getCourseCatalog() e getStudentCourses(id) . Il front-end non avrebbe bisogno di preoccuparsi della logica aziendale, ma solo di visualizzare i dati. A seconda dell'interazione dell'utente, dovrà chiamare servizi di applicazione come registerStudent(id, courseId) sul server.

Naturalmente, ci sono molti altri modi per farlo. Ma avere un'architettura mista, con alcune logiche di business eseguite sul front-end sarebbe una cattiva idea: la logica di business ha bisogno di un accesso più frequente agli oggetti di dominio che sono gestiti sul server, e i numeri di latenza che ogni programmatore dovrebbe sapere suggeriscono che questo potrebbe essere un collo di bottiglia per le prestazioni (non parlando delle responsabilità poco chiare).

Posso solo consigliarti l'eccellente libro di Martin Fowler "Modelli di Enterprise Application Architecture" che affronta questo tipo di argomenti in un modo molto chiaro ed esauriente.

Un'altra utile fonte di idee può essere questo sito web .

    
risposta data 03.01.2017 - 15:59
fonte
0

I servizi Web sono solo il modo in cui parti della tua applicazione comunicano con i moduli di core business. Non ha nulla a che fare con l'implementazione della logica aziendale. Dovresti sempre definire i processi su BL (ad esempio GetStudentCourses, AddStudentCourse ecc.) Ed esporli in base all'architettura. Come servizi web se app remota, uso diretto del livello di servizio se web app ecc.

    
risposta data 29.07.2018 - 01:56
fonte

Leggi altre domande sui tag