Consigli sull'architettura (WCF / MVC)

3

Prima di tutto, le basi.

Applicazione a più livelli: presentazione, livello aziendale, database. È una vecchia applicazione .NET 2.0 (WSE + WinForms), un po 'più strettamente accoppiata di quanto mi piacerebbe, e il requisito è quello di aggiornarlo a un'architettura più recente, eliminando allo stesso tempo il design tutt'altro che ideale scelte fatte più di 10 anni fa (es. usate DTO invece di datatable / viste DB direttamente sul client ecc.)

Sto pensando di seguire il seguente disegno, a grandi linee:

  • Creare una classe del livello della logica aziendale che includa tutte le logiche di business, le convalide ecc., utilizzando una classe di accesso ai dati per le operazioni CRUD.
  • Esporre questo BLL utilizzando un livello di servizio WCF come wrapper per i suoi metodi.
  • Consuma il servizio WCF dal nuovo client (probabilmente WPF).

Per centralizzare tutte le operazioni relative a WCF nel progetto client, creerò una classe helper che gestisce la connessione al servizio WCF e si comporta come una facciata per le operazioni di servizio.

Ora, allo stesso tempo, ci sarà una nuova applicazione Web (MVC) che utilizzerà alcune delle operazioni definite nella BLL. Tuttavia, a causa dell'esternalizzazione e di altri motivi che esulano dall'ambito di questa domanda, ciò che in particolare non voglio è che lo sviluppatore del controller MVC utilizzi (o addirittura conosca) ad es. %codice%. Al contrario, non vorrei che lo sviluppatore del servizio WCF fosse in grado di utilizzare BLLAssembly.WCFOnlyMethod() . Immagino che entrambi questi casi possano essere coperti utilizzando i simboli di compilazione condizionale nell'assieme BLL (ad esempio WEB_ONLY / WCF_ONLY), ma ovviamente ciò significa due diverse versioni di esso, uno per ciascun progetto.

Quindi la mia domanda è:

Given the fact that there will be a single BLL in order to maximize code reuse, what is the optimal approach for referencing the BLL from the WCF service and the MVC controller?

The WCF service will have a hard-reference to the BLL, that much I can say with relative certainty. Client-side, the helper class will have a reference to the WCF service interface, which will be implemented by the proxy. That way the WPF client is not affected by internal changes in the BLL, as it should be.

  • Should the MVC controller have a hard-reference to (its version of) the BLL assembly as well?

  • Should I use a WCF service for the MVC project, as discussed here (Is this breaking SOA?) or is that overkill? The production server(s) will be the same for both projects.

  • Should I have the MVC controller reference an interface, instead of the actual BLL assembly? I would still need to instantiate an actual class implementing that interface, of course, so somehow the assembly should be passed to the MVC project... or I could use a WCF service (see above).

  • Or should I abandon the notion of a common BLL between the projects altogether?

Grazie in anticipo per qualsiasi consiglio.

    
posta Spyros 20.05.2015 - 10:03
fonte

1 risposta

1

Puoi avere un componente BLL comune, esposto come un servizio web abbastanza felicemente. Basta esporre 2 interfacce sul lato WCF di cose che sono implementate con gli stessi metodi nella BLL. Sia i thick client che il sito Web MVC effettuano chiamate a questo comune servizio web WCF, ma ognuno utilizza un'interfaccia diversa.

Quindi hai un sito Web che solo il servizio web può chiamare, e un altro per i clienti di spessore. Consenti solo agli sviluppatori del sito web di accedere al primo servizio non concedendo loro le chiavi di sicurezza per accedervi - avrai una qualche forma di sicurezza per impedire utenti non autorizzati ma avrai anche un po 'di sicurezza per limitare l'accesso anche alle applicazioni canaglia .

    
risposta data 20.05.2015 - 10:31
fonte

Leggi altre domande sui tag