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.