Aggiornamento di un'entità tramite un livello di servizio

5

Qual è il modo migliore per aggiornare un'entità utilizzando un livello di servizio? Eseguendo una singola azione atomica, riesco a capire come BlogService.Publish (blogID) ma come modificare più valori che si associano all'entità del database? Considera il seguente codice:

public void Company(model As CompanyViewModel) {

     var comp = _companyQueryService.GetByID(model.ID)

     // ??? now what?

}

Potrei passare il viewmodel a qualche tipo di metodo UpdateCompany ma legare il viewmodel al servizio sembra super icky.

Potrei modificare direttamente i valori sull'entità, ma come posso salvare le modifiche senza accedere al contesto? (Il mio contesto è solo iniettato nei servizi tramite un meccanismo di scoping del contesto che mi consente di nidificare dbcontexts per transazioni atomiche e multi-azione.)

Potrei modificare i valori direttamente sull'entità e quindi chiamare direttamente SaveChanges sul servizio, ma preferirei che i servizi dettino quando il contesto viene salvato.

Ci sono altre opzioni?

    
posta Steve 22.05.2015 - 14:28
fonte

1 risposta

1

Perché non inserire un servizio applicativo nel viewmodel? Il viewmodel utilizzerà quindi il servizio dell'applicazione per interagire con il repository. Il tuo codice sarà simile a questo:

Livello applicazione

public class CompanyView
{
    public CompanyView(CompanyViewModel companyVM)
    {
        _companyVM = companyVM;
    }

    // view methods
    // if using WPF, would most likely not exist

    private CompanyViewModel _companyVM;
}

public class CompanyViewModel
{
    public CompanyViewModel(CompanyAppService companyService)
    {
        _companyService = companyService;
    }

    // view model methods to handle application logic

    private CompanyAppService _companyService;
}

public class CompanyAppService
{
    public CompanyAppService(ICompanyRepository companyRepo)
    {
        _companyRepo = companyRepo;
    }

    // application service methods that tie everything together with
    // logging, coordinating BLL method calls, persistence, etc.

    private ICompanyRepo _companyRepo;
}

Livello aziendale

interface ICompanyRepository
{
    // CRUD interface methods

    Company getById(CompanyId id);
}

public class Company
{
    // handle business logic of a company entity
}

Livello di accesso ai dati

public class SqlCompanyRepository : ICompanyRepository
{
    // implement CRUD methods for SQL databse

    Company getById(CompanyId id) { //return a company entity }
}

Quindi inseriresti tutto in Main (o MainViewModel) come:

CompanyView companyView = new CompanyView(
    new CompanyViewModel(
    new CompanyAppService(
    new SqlCompanyRepository())));

Ovviamente con MVC non avresti un viewmodel, ma utilizzerei invece un controller per gestire la logica dell'applicazione. Il tuo servizio gestirà quindi l'organizzazione del livello aziendale, la registrazione, il salvataggio nel database, ecc.

Inoltre, il tuo modello di dominio avrebbe eventi di dominio a cui il livello dell'applicazione potrebbe iscriversi per cose come la registrazione.

    
risposta data 03.10.2018 - 18:52
fonte

Leggi altre domande sui tag