Quando i servizi dovrebbero mantenere i dati? [chiuso]

2

Esiste un modo preferibile in cui un servizio dovrebbe mantenere i dati?

Aggiorna

Dipende se i servizi sono pubblici o interni?

Alcuni servizi accettano oggetti entità come parametri per eseguire azioni su quell'oggetto, aggiornarne lo stato o aggiungervi alcuni dati. Questo servizio dovrebbe anche mantenere le modifiche a quell'oggetto nel database (SaveChanges, Flush, ...) o il chiamante che ha ottenuto / creato quell'entità decide se e quando farlo persistere?

Rendendo il servizio interno persistente i dati includono problemi come: test più difficili, non possono usare transazioni di database implicite, forse molti roundtrip di database invece di uno.

È meglio descriverlo con un esempio:

public void PerformAction(int productId, int actionId)
{
    var product = productRepository.GetProduct(productId);
    var action = actionRepository.GetAction(actionId);

    actionService.PerformAction(product, action);

    //Should this be necessary?
    productRepository.Update(product);
}

Ciò sarebbe ovvio, ma il PerformAction non può avere dipendenze diverse dal modello:

public void PerformAction(int productId, int actionId)
{
    var product = productRepository.GetProduct(productId);
    var action = actionRepository.GetAction(actionId);

    product.PerformAction(action);

    //Obviously necessary!
    productRepository.Update(product);
}
    
posta Jakob 14.08.2015 - 15:00
fonte

2 risposte

2

Se si salvano esplicitamente i dati, il posto migliore per eseguire ciò si trova in una chiamata alla fine del metodo di livello più alto, il punto di accesso al servizio. Ciò significa che devi dividere i tuoi metodi di servizio in due categorie, quelli pubblici, i metodi entry level e quelli che sono metodi interni, che non dovrebbero salvare dati.

    
risposta data 14.08.2015 - 19:10
fonte
0

Se non hai una strong motivazione, dovresti utilizzare un ORM (Entity Framework, NHibernate).

Quando lavori con un ORM, gli oggetti che sono stati restituiti dal database saranno "osservati" ed eseguirai semplicemente "SaveChanges ();" lasciando il lavoro sporco all'ORM;

L'ORM controllerà automaticamente quali entità devono essere persistenti e se non ci sono cambiamenti da fare, non fa nulla.

Perché, anche nel tuo secondo esempio, il prodotto dell'entità potrebbe avere una regola aziendale in cui non modifica alcun attributo in determinati casi.

public void PerformAction(int productId, int actionId)
{
    var product = productRepository.GetProduct(productId);
    var action = actionRepository.GetAction(actionId);

    actionService.PerformAction(product, action);

    productRepository.Context.SaveChanges();
}

Se preferisci non utilizzare un ORM, puoi "reinventare la ruota" e utilizzare gli stessi schemi di progettazione che usano:

link

link

Riguardo a dove dovresti eseguire "SaveChanges", dipende da quali livelli sono ciascuno i loro servizi.

Un approccio che mi piace usare è mettere tutti i "SaveChanges" nel livello applicazione (di DDD).

Riferimenti: link

    
risposta data 14.08.2015 - 16:21
fonte

Leggi altre domande sui tag