La logica di dominio nel livello di servizio è stata esposta come servizio WCF

4

Sto progettando una soluzione aziendale che consiste in prodotti modularizzati all'interno di una gamma di prodotti utilizzando il codice Entity Framework per definire innanzitutto il modello di dominio e fornire l'accesso ai dati.

es. Soluzioni:

ProductRange.Authentication
ProductRange.Gateway
ProductRange.OrderSystem
ProductRange.MarketingSystem

Ciascuno di questi prodotti (soluzioni) avrà livelli simili, attualmente:

Progetti in ciascuna soluzione:

ProductRange.OrderSystem.Model (contains code first POCOs)
ProductRange.OrderSystem.DataContext (contains the dbContext)
ProductRange.OrderSystem.DataAccess (contains the Generic Repository)
ProductRange.OrderSystem.Service.DomainLogic (contains business logic)
ProductRange.OrderSystem.Service.ApplicationLogic (contains application logic)
ProductRange.OrderSystem.Presentation.AdminWebsite
ProductRange.OrderSystem.Presentation.CustomerWebsite

Alcuni prodotti dovranno accedere alla logica di dominio di un altro prodotto, in particolare tutti dovranno accedere a ProductRange.Authentication ma anche ProductRange.MarketingSystem dovrà eseguire una query su ProductRange.OrderSystem

Sto pensando di esporre la logica del dominio tra i prodotti nell'intervallo tramite un servizio WCF. Ma dovrò anche fare riferimento al prodotto localmente (ad es. Creare riferimenti al progetto).

Come dovrei andare a implementare questo? Dovrei creare un servizio WCF, ad es. ProductRange.OrderSystem.WCF che chiama la logica del dominio e la espone oppure dovrebbe essere la mia logica di dominio un servizio WCF? In quest'ultimo caso, dovrei sempre fare riferimento alla mia logica di dominio tramite WCF, anche dal locale ApplicationLogic?

Suppongo di essere in cerca di indicazioni su quali livelli disporre e su come fornire la migliore connettività tra le soluzioni.

    
posta Dan Cook 25.09.2013 - 14:47
fonte

2 risposte

2

Ecco i miei due centesimi, ho cercato di trovare il supporto per il mio "WCF è solo un'interfaccia" su google ma non ho avuto fortuna. Ci riproverò stasera se ne avrò la possibilità.

Il modo in cui mi è stato insegnato e mi sono sempre avvicinato a questo è che WCF è solo un'altra interfaccia (usando l'interfaccia del termine nel modo in cui "GUI" la usa non come parola chiave .Net), in particolare un modo per accedere al codice su un rete (o Internet, ecc.) Ho sempre una libreria di classi distinta a cui il servizio WCF delega per tutte le funzionalità non correlate a WCF.

Quella libreria di classi è progettata per essere utilizzabile da qualsiasi codice .Net sulla stessa macchina.

Il servizio WCF farà il lavoro per rendere la libreria consumabile da una varietà di lingue sul filo. Può tradurre tipi .Net in tipi più generici, elenchi di array, ad esempio, o aggiungere compressione per motivi di prestazioni.

Quindi, se stai consumando la libreria dal codice .Net sulla stessa macchina, andrei direttamente contro la libreria di classi. Potresti installarlo nel GAC per il controllo della versione.

Ovviamente, se il servizio è di stato, potresti volerlo codificare per semplicità.

Modifica. Ho pensato ad un altro motivo per cui potresti voler bypassare la WCF localmente. Per motivi di prestazioni, un client WCF non dovrebbe mai essere "chiacchierone", è meglio fare meno chiamate che richiamano più dati, correndo contro una DLL questa limitazione non è importante. Quindi la tua libreria di classi potrebbe esporre metodi che non vorresti esporre su WCF.

    
risposta data 26.09.2013 - 22:52
fonte
0

Quello che devi chiedere è, quale modello verrà eseguito il mio codice? Se sta per essere eseguito interamente all'interno di una singola macchina, non c'è alcun punto in un servizio WCF. Se sta per essere eseguito in un modello di rete, l'inserimento della logica in un servizio WCF per i client da chiamare ha senso SE i client non avranno accesso a una risorsa (ad es. Database)

In pratica, le tue classi logiche di dominio dovrebbero essere esposte come interfacce ai client che consumano, in modo che se decidi di cambiare l'implementazione da una singola macchina a WCF o REST, le classi consumer non conosceranno la differenza. -PatFromCanada ha alluso a questo

I tuoi 'layers' dovrebbero essere triagicati seguendo lo stesso principio, solo creare progetti separati per i file separati da distribuire. Separa i "livelli" in base agli spazi dei nomi

    
risposta data 27.09.2013 - 00:01
fonte

Leggi altre domande sui tag