puoi avere troppi metodi di mappatura dto / bo

2

Ho un servizio Windows, 2 servizi web e un'interfaccia web che devono seguire lo stesso percorso (dati saggio).

Quindi ho inventato due modi per creare la mia soluzione.

Lamiapreoccupazioneèilfattochel'interfacciautente/WS/etcavràilpropriotipodiDTO(diciamoilmodelloinASP.NetMVC)chedovrebbeesseremappatosuunDTOinmodochelaSLpossaquindimapparlosuunaBOquindimapparloalDCOEF6correttoinmodochepossasalvarloinundatabase.

Quindistopensandodifarloinquestomodo

per rimuovere un livello di mappatura.

Quale dovrei prendere? O c'è una terza soluzione?

    
posta Fredou 02.12.2013 - 15:50
fonte

3 risposte

1

Ho scritto un'implementazione di un bus di servizio aziendale. Abbiamo un'API del servizio web rivolta al cliente, un servizio Web che guida l'interfaccia utente basata sul web, almeno una dozzina di diversi servizi Windows che girano su macchine client, una mezza dozzina di servizi che girano su server, insieme a tre diversi database (Couchbase, Elasticsearch, SQL).

Ho preso la decisione in anticipo per creare una libreria "core" che essenzialmente non è altro che semplici oggetti e codice di utilità. Questo contiene gli oggetti e i messaggi che vengono passati attorno all'applicazione. Poi ho un altro set di librerie simili per i servizi lato client e lato server. Infine, ho le mie librerie di servizi web, dove o passano oggetti semplici dal core, o ho creato classi di input / output specifiche per endpoint per ogni metodo web, che sono prontamente convertiti in classi "core" in modo che possano essere spostati l'applicazione.

Il vantaggio di questo è che ho un'architettura write-once, use anywhere che è estremamente efficiente. È facile promuovere e abbassare le classi nel nucleo quando necessario. Lo svantaggio è che se si dispone di più soluzioni in Visual Studio, qualsiasi tipo di refactoring richiede realmente che tutti i progetti esistenti siano aperti in modo da poter eseguire la ridenominazione senza introdurre errori del compilatore. Alla fine, se dovessi ricominciare da capo, farei la stessa cosa. È stata davvero una buona struttura per me.

    
risposta data 28.11.2014 - 00:44
fonte
1

Si può andare con il modello di dominio appropriato, che può essere utilizzato su SL, BL e DAL. E per WebServices / WindowsService e per l'interfaccia utente utilizzerei il DTO appropriato, che potrebbe essere diverso ma che ha senso perché ogni servizio potrebbe esporre funzionalità diverse. Ad esempio, immagina che il dominio sia come

Order 
{
    long orderId { get; set;}
    decimal value { get; set;}
    Customer customer { get; set;}
    List<Orderline> orderlines { get }

    void Add(Product p,qty q)
    {
        orderlines.Add(new Orderline(){order = this, product = p,qty = q,unitPrice = p.unitPrice});
        value += p.unitPrice * q;
    }
}

Customer
{
    long customerId { get; set;}
    string firstName { get; set;}
    string lastName { get; set;}
}

OrderLine
{
    Order order { get; set; }
    Product product { get; set;}
    decimal qty { get; set;}
    decimal unitPrice { get; set;}
}

Product
{
   long productId { get; set;}
   string productName { get; set;}
   decimal unitPrice { get; set;}
}

E questo modello di dominio può essere persistente / contiene anche la logica di business. Quindi questo modello può essere utilizzato su SL / BLL / DAL.

Nel servizio web quando vuoi ottenere i dettagli dell'ordine, potresti voler mappare in un DTO come,

OrderWSDTO
{
     long orderId { get; set;}
     string customerName { get; set; }
}

OrderLineWSDTO
{
    string productName { get; set;}
    decimal quantity { get; set;}
    decimal value { get; set;}
}

Tuttavia in UI (lista ordini) potrebbe essere una rappresentazione completamente diversa.

OrderSummaryUIDTO
{
    string orderId { get; set;}
    decimal value { get; set;}
    string commaSeparatedProductNames { get; set;}
}
    
risposta data 26.02.2015 - 05:29
fonte
0

Il mio istinto è che il Service Layer non ha bisogno di conoscere DTO, quindi sulla base di ciò direi che la tua seconda architettura ha più senso. Alcuni livelli di presentazione potrebbero dover essere mappati in oggetti specializzati come DTO e modelli di visualizzazione, ma potrebbe anche essere opportuno utilizzare BO nudi per gli altri se i dati sono già in una forma utilizzabile.

    
risposta data 02.12.2013 - 16:41
fonte

Leggi altre domande sui tag