Atualizando uma entidade através de uma camada de serviço

5

Qual é a melhor maneira de atualizar uma entidade usando uma camada de serviço? Realizando uma única ação atômica, eu posso entender como BlogService.Publish (blogID), mas que sobre a edição de vários valores que mapeiam para a entidade de banco de dados? Considere o seguinte código:

public void Company(model As CompanyViewModel) {

     var comp = _companyQueryService.GetByID(model.ID)

     // ??? now what?

}

Eu poderia passar o viewmodel para algum tipo de método UpdateCompany, mas amarrar o viewmodel ao serviço soa super complicado.

Eu poderia editar os valores diretamente na entidade, mas como faço para salvar as alterações sem acesso ao contexto? (Meu contexto é injetado apenas em serviços por meio de um mecanismo de escopo de contexto que me permite aninhar dbcontextos para transações atômicas e de várias ações.)

Eu poderia editar os valores diretamente na entidade e, em seguida, apenas chamar SaveChanges no serviço diretamente, mas prefiro deixar os serviços ditarem quando o contexto é salvo.

Existem outras opções?

    
por Steve 22.05.2015 / 14:28
fonte

1 resposta

1

Por que não injetar um serviço de aplicativo no viewmodel? O viewmodel usaria o serviço de aplicativo para interagir com o repositório. Seu código ficaria assim:

Camada de aplicativos

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;
}

Camada de negócios

interface ICompanyRepository
{
    // CRUD interface methods

    Company getById(CompanyId id);
}

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

Camada de acesso a dados

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

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

Então você deve injetar tudo no Main (ou MainViewModel) como:

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

Obviamente, com o MVC você não teria um viewmodel, mas usaria um controlador para lidar com a lógica do aplicativo. Seu serviço, então, lidaria com a orquestração da camada de negócios, o registro, o salvamento no banco de dados, etc.

Além disso, seu modelo de domínio teria eventos de domínio para os quais a camada do aplicativo poderia se inscrever para coisas como registro em log.

    
por 03.10.2018 / 18:52
fonte