MVC e JSF

Seguinte pessoal, comprei um livro sobre Arquitetura de Sistema e estou estudando sobre MVC.

Pelo o que diz no livro, o MVC é composto por Model, View e Controller e basicamente o funcionamento é View -> Controller -> Model , certo?

Então, no livro possui um exemplo em que a pagina é feita em JSP, que sao as Views, possui também o Controller em Servlet, os VO (value Object) que são os beans das tabelas e tambem os Application Service, que seria a camada de negocio da aplicação.

Eu entendi a logica que o autor utilizou, porém, não consigo encaixar isso no JSF. Estou fazendo vários testes no PrimeFaces, mas não consigo criar uma camada Controller. Pelo que li e vi alguns comentários aqui no forum, para o framework jsf e alguns outros, o proprio framework é a camada Controller. Isso é verdade?

Outra coisa que tenho duvida é que para acessar um metodo ou atributo de uma classe, eu tenho que definir ela como ManagedBean? É somente esse jeito que consigo acessar #{mb.metodo()} ?

Li no fórum que não existe regra em relação ao ManagedBean ter ou não as regras de negocio dentro dele. O que voces me dizem sobre isso?

Eu pensei em fazer assim, criar tipo um ManagedBean que terá as regras de negocios, inclusive o objeto em questão que sera utilizado e através desse objeto, jogo para os campos do jsf… Tipo assim:

[code]@ManagedBean (name=“funcService”)
@ViewScoped
Class FuncionarioService {
private Funcionario func;

//getters e setters

//regra de negocio
public void salvarFuncionario(){}
public void verificarAlgo(){}
}[/code]

e na view, nos campos de input utilizar #{funcService.func.id} e quando tiver que chamar um metodo, o chamo direto #{funcService.salvarFuncionario()}…

O meu raciocínio está certo?

Ainda falta muito do livro para ler, mas preciso entender se o que estou realmente colocando na minha cabeça é o correto.

Coloquei em lugar errado, por favor, mova para Frameworks em geral, ser ser brasileiros.

JSF é confuso mesmo nisso pois é diferente demais da maioria do mundo, ate hoje nao consegui gostar. Da uma olhada aqui pra tentar esclarecer um pouco: http://blog.caelum.com.br/entenda-os-mvcs-e-os-frameworks-action-e-component-based/ (le principalmente a partir de “O fluxo no JSF e como se encaixa no MVC”) e no site do Hebert tem muita coisa pratica: http://uaihebert.com/?s=jsf&submit=Search

Agora eu realmente entendi, o proprio framework jsf possui o Controlador, bastando eu apenas fazer os ManagedBean que é o que comunica a View com o Modelo, certo?

Eu andei pesquisando aqui e descobri um tal de Back Bean, isso é muito utilizado?

[quote=Gleidson Henrique]Seguinte pessoal, comprei um livro sobre Arquitetura de Sistema e estou estudando sobre MVC.

Pelo o que diz no livro, o MVC é composto por Model, View e Controller e basicamente o funcionamento é View -> Controller -> Model , certo?
[/quote]

Mais ou menos. O MVC é um padrão de componentes onde os componentes formam um triangulo, não uma sequencia.

Isto é porque o modelo de servelts normal é MVC. ( Na realidade é o chamado Modelo II. O Modelo I é onde existiam JSP fazendo o papel do servlet)
JSF não é baseado em MVC (é baseado em MVVM como o ASP.Net) , mas se tivessemos de entender o jsf com base nesse padrão a view seria onde vc define os componentes , o controller é o proprio jsf ( é o engine em si mesmo) e o model é o managedbean.
No struts por exemplo, a view é o jsp, o controler é o proprio struts e as actins são o model. O Model é sempre parte que vc estende para incluir suas lógicas.

quando a usar os managedbeans como repositorio de lógica é uma má ideia. A única lógica que eles podem ter é a de navegação e vai que vai. Na realidade ai vc precisava usar outro padrão, chamado MVP para isolar o seu managed bean do resto da aplicação.
Nesse caso o ManagedBean teria dois papeis, ele seria o model do ponto de vista do jsf, mas seria o view do ponto de vista do MVP. E ai vc cria um objeto Presenter. A ideia aqui é que se a View muda, o Presenter não muda. Isto significa que poderia mudar de jsf para struts ou VRaptor e o seu presenter seria o mesmo. Inclusive se vc mudasse de web para desktop, por exemplo. Ai seria onde ficam as logicas de navegação e a chamada a serviços.

O MVP é usado na camada de apresentação, mas como esta camada é normalmente esquecida e os managedbeans ligam dirato aos services ou são os services eles mesmos ( como no jboss seam) é pouco usado.

Cara, voce me deixou meio confuso referente a esses tipos de programação, mas estarei dando uma estudada sobre esse ‘jogo de letras’ rsrs

O que eu quero é fazer um sistema, para gerenciamento de empresas (clientes, fornecedores, nota fiscal, contas a pagar/receber, cupom fiscal).

Você acha que utilizar o JSF seria uma boa para desenvolver esse tipo de sistema? Pelo que estou percebendo, seria um desenvolvimento extremamente rápido.

Pelo que entendi, no link que foi passado, a diferença de JSF e outro framework, como o VRaptor, é que no JSF eu perco o controle sobre a view. O que seria esse ‘perca de controle’ ?

[quote=Gleidson Henrique
Pelo que entendi, no link que foi passado, a diferença de JSF e outro framework, como o VRaptor, é que no JSF eu perco o controle sobre a view. O que seria esse ‘perca de controle’ ?

[/quote]
No JSF na maioria das vezes voce fica mais preso a configuracoes de componentes proprios dele, a mente se distancia de mexer diretamente com a realidade da web que é html e jquery, pois ele vai renderizar automaticamente de acordo com o componente e suas propriedades. No VRaptor (ou qualquer framework web action based) voce lida diretamente com a renderizacao de html e programacao do client com jquery, ou seja o html puro nas suas mãos onde voce pode fazer o que quiser sem depender de elementos intermediarios, podendo usar frontends html nao amarrados a tecnologias servidor como bootstrap ou jqueryui. Se voce gosta de html e jquery entao nao vai gostar de JSF, mas do contrario vai gostar, se gosta de programar estilo desktop. Claro que tambem é possivel usar html diretamente com JSF, mas nao é seu natural. E voce viu que no action based o padrao de arquitetura nao é confuso, é MVC “classico”. Experimente os dois mundos e depois foque no que voce ou sua equipe se sentir mais confortavel. Para action based o pessoal tem recomendado mais Spring MVC.

Entendi, foi o que eu realmente tinha pensado, mas queria apenas confirmar. Então, como minha vontade é programar de uma maneira rápida e fácil, acredito que o JSF vai servir, apenas tenho que entender certinho a maneira certa de se programar.

Quero que voces me ajudem por favor no exemplo que fiz aqui.

Segue abaixo os Pacotes e Classes.

dao
-GenericoDao.java
-HibernateUtil.java

service
-UsuarioService.java

vo
-Usuario.java

E na view
Usuario.xhtml
CadUsuario.xhtml

Segue abaixo as classes.

[code]package vo;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.*;

import dao.GenericDao;

import java.util.List;

/**

  • The persistent class for the usuarios database table.

*/
@Entity
@Table(name=“usuarios”)
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private int id;

private String email;

private String senha;

private String usuario;

//bi-directional many-to-one association to Dorksbuscador
@OneToMany(mappedBy="usuario")
private List<Dorksbuscador> dorksbuscadors;

//bi-directional many-to-one association to Pagina
@OneToMany(mappedBy="usuario")
private List<Pagina> paginas;

//bi-directional many-to-one association to Site
@OneToMany(mappedBy="usuario")
private List<Site> sites;

//bi-directional many-to-one association to Variavei
@OneToMany(mappedBy="usuario")
private List<Variavei> variaveis;

public Usuario() {
}

public int getId() {
	return this.id;
}

public void setId(int id) {
	this.id = id;
}

public String getEmail() {
	return this.email;
}

public void setEmail(String email) {
	this.email = email;
}

public String getSenha() {
	return this.senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public String getUsuario() {
	return this.usuario;
}

public void setUsuario(String usuario) {
	this.usuario = usuario;
}

public List<Dorksbuscador> getDorksbuscadors() {
	return this.dorksbuscadors;
}

public void setDorksbuscadors(List<Dorksbuscador> dorksbuscadors) {
	this.dorksbuscadors = dorksbuscadors;
}

public List<Pagina> getPaginas() {
	return this.paginas;
}

public void setPaginas(List<Pagina> paginas) {
	this.paginas = paginas;
}

public List<Site> getSites() {
	return this.sites;
}

public void setSites(List<Site> sites) {
	this.sites = sites;
}

public List<Variavei> getVariaveis() {
	return this.variaveis;
}

public void setVariaveis(List<Variavei> variaveis) {
	this.variaveis = variaveis;
}

}[/code]

[code]package service;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import vo.Usuario;
import dao.GenericDao;

@ManagedBean (name=“UsuarioService”)
@SessionScoped
public class UsuarioService {

Usuario usuario = new Usuario();

public Usuario getUsuario() {
	return usuario;
}

public void setUsuario(Usuario usuario) {
	this.usuario = usuario;
}

public void salvarUsuario(ActionEvent actionEvent) throws Exception{
	GenericDao dao = new GenericDao();
    dao.saveOrUpdate(this);
	FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("O usuário foi registrado com sucesso!"));
}

public void editarUsuario(Usuario usuario) throws Exception{
	this.usuario = usuario;
	FacesContext.getCurrentInstance().getExternalContext().redirect("cadUsuario.xhtml");
}

public void excluirUsuario(Usuario usuario) throws Exception{
	GenericDao dao = new GenericDao();
	dao.remove(usuario);
	FacesContext.getCurrentInstance().getExternalContext().redirect("Usuario.xhtml");
}

public List<Usuario> getListarUsuarios(){
	GenericDao dao = new GenericDao();
	Usuario usuario = new Usuario();
	List<Usuario> listaUsuarios = dao.findAll(usuario);
	return listaUsuarios;
}

}
[/code]

[code]
<ui:composition xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns=“http://www.w3.org/1999/xhtml”>

<p:layout fullPage=“true”>

<p:layoutUnit position="west" size="250">
	<ui:include src="cabecalho.xhtml"></ui:include>
</p:layoutUnit>

<p:layoutUnit position="center">

        <h:panelGrid columns="2" cellpadding="10" style="width: 100%;">

			<h:form id="form2" >

			<p:button value="Novo" href="cadUsuario.xhtml" />

		    <p:dataTable var="user" value="#{UsuarioService.listarUsuarios}" rowKey="#{UsuarioService.usuario.id}" paginator="true" rows="3"  
		                selection="#{UsuarioService.usuario.id}" filteredValue="#{UsuarioService.listarUsuarios}" id="tblUsuarios">  
		  
		          
		  
		        <p:column headerText="Usuario" footerText="Login" sortBy="#{user.usuario.usuario}" filterBy="#{user.usuario}" id="usuario">  
		            #{user.usuario}  
		        </p:column>  
		  
		        <p:column headerText="Senha" sortBy="#{user.senha}" filterBy="#{user.usuario.senha}" id="senha">  
		            #{user.senha}  
		        </p:column>  
		  
		        <p:column headerText="E-mail" sortBy="#{user.email}" filterBy="#{user.usuario.email}" id="email">  
		            #{user.email}  
		        </p:column>
		        
		        <p:column id="editar">  
		            <p:commandButton title="Alterar" actionListener="#{UsuarioService.editarUsuario(user)}" icon="ui-icon-pencil" /> 
		            <p:commandButton title="Excluir" actionListener="#{UsuarioService.excluirUsuario(user)}" icon="ui-icon-close" />
		        </p:column>  
		  
		    </p:dataTable>  

		</h:form>

        </h:panelGrid>  


</p:layoutUnit>

</p:layout>

</h:body>

</ui:composition>[/code]

[code]
<ui:composition xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns=“http://www.w3.org/1999/xhtml”>

</h:head>
<h:body>

<p:layout fullPage=“true”>

<p:layoutUnit position="west" size="250">
	<ui:include src="cabecalho.xhtml"></ui:include>
</p:layoutUnit>

<p:layoutUnit position="center">

        <h:panelGrid columns="2" cellpadding="10">  
              <h:form id="form" >

			    <p:panel id="panel" header="Cadastrar Usuário">  
			        <p:messages id="messages" />
			        <h:panelGrid columns="3">  
			            <h:outputLabel for="usuario" value="Usuário " />  
			            <p:inputText id="usuario"   
			                value="#{UsuarioService.usuario.usuario}" required="true" label="usuario">   
			            </p:inputText>  
			            <p:message for="usuario" />  
			              
			            <h:outputLabel for="senha" value="Senha: " />  
			            <p:inputText id="senha"   
			                value="#{UsuarioService.usuario.senha}" required="true" label="senha"/>  
			            <p:message for="senha" />  
			            
			            <h:outputLabel for="email" value="E-mail: " />  
			            <p:inputText id="email"   
			                value="#{UsuarioService.usuario.email}" required="true" label="email"/>  
			            <p:message for="email" />
			        </h:panelGrid>  
			    </p:panel>  
			  
			    <p:commandButton value="Salvar" update="panel" id="ajax"  
			             actionListener="#{UsuarioService.salvarUsuario}" styleClass="ui-priority-primary"/>
			             
			    <p:button value="Retornar" href="Usuario.xhtml" />  
			                        
			</h:form>
        </h:panelGrid>  


</p:layoutUnit>

</p:layout>

</h:body>

</ui:composition>[/code]

Explicando de uma maneira rapidao, o arquivo Usuario.xhtml mostrara uma tabela com os botoes alterar e excluir. Quando eu clicar em alterar, as informações que estiverem na tela serão passadas pelo metodo de alterar, pelo ActionListener e a aplicação irá para a pagina CadUsuario.xhtml, mostrando as informações lá. Por isso utilizei o escopo SessionScoped.

O Usuario.java é o Bean, contendo apenas os metodos da tabela e a anotação @Table

Já o UsuarioService.java é o ManageBean, que ficará a logica de negocio da aplicação. Nesse caso, seria os metodos de inserir um novo, excluir, metodo de listar todos usuarios, outras regras que existam para os Usuarios… enfim.

Essa é a maneira correta e a que o pessoal está acostumado de fazer?

[quote=Gleidson Henrique]Cara, voce me deixou meio confuso referente a esses tipos de programação, mas estarei dando uma estudada sobre esse ‘jogo de letras’ rsrs

O que eu quero é fazer um sistema, para gerenciamento de empresas (clientes, fornecedores, nota fiscal, contas a pagar/receber, cupom fiscal).

Você acha que utilizar o JSF seria uma boa para desenvolver esse tipo de sistema? Pelo que estou percebendo, seria um desenvolvimento extremamente rápido.
[/quote]

Existe mais rápido. Dê uma olhada no Vaadin.
Tudo depende do estilo que vc quer usar e quanto vc quer mexer com o HTML. O JSF faz parte de uma familia de frameworks chamados “Component Based”. Nesta familia vc deelga aos componentes que eles saibam se renderizar e entender os gestos dos usuários e só informar para vc coisas interessantes (eventos). Em jsp puro, por exemplo, vc tem que programar tudo isto do zero. Em frameworks “Action Based” como struts, spring mvc, vraptor e outros, o framework só trata do processamento e vc tem que programar manualmente os componentes gráficos ou usar os componentes limitados do HTML padrão. Uma coisa comum comum um dropdown de data, dá muito trabalho. Então em sistemas oritentados a formulários é importante ter uma boa ferramente Component Based. O JSF foi o primeiro e é padrão JEE, mas hoje em dia existem outras opções como o Vaadin e o ZK que lhe dão componentes mais avançados e uma lógica de controle mais simples.

Não pense em “view”. Pense em UI (User Interface). A UI é por si só um andar do sistema (o cliente). E ela tem que entender os gestos dos usuários, cliques , drag and drop, mouse-move, hoje em dia até toque, mudança de oerientação da tela, etc… Tudo isto não é o sistema, é a interação gráfica. Os frameworks component bases partem do principio que com um conjunto de componentes vc consegue fazer qualquer interação gráfica. E eles cuidam de todos os detalhes. É transparente. É o inverso de quando vc usa JDBC. Vc usa e espera que o banco faça o que tem que fazer, vc não está nem ai como ele faz as queries, cria os indices, se usa o algoritmo X ou Y, etc… está tudo encapsulado no componente “SGBD”. O JSF e companhia tentam fazer esta absbtração para vc, interpetando os gestos do usuário no browser e enviando para o servidor. Isso é uma vantagem muito grande. Vc perde “o controle” no sentido que se vc quer por alguma coisa na tela , vc vai ter que criar um componente, não dá para fazer gambiarra como faria com jsp. Mas esta perda de controle é boa. Porque vc abstraiu todo um conjunto complexo de lógicas que são sempre as mesmas e não fazem parte do sistema em si. É como se vc tivesse que implementar um banco de dados novo a cada projeto. Ninguém faz isso, mas muita gene implementa uma UI nova a cada projeto. Reaproveitamenteo zero. Os Component Based dão mais do que o controle sobre a UI. Eles são a UI. No VRaptor e outros action based, vc tem que criar a ui no braço controlando tudo com GET e POST do HTTP. É enfadonho e não é reaproveitável porque normalmente o pessoa não pensa em criar componentes de ui ( que dá para fazer com tags, mesmo com jsp padrão)

sergiotaborda, entendi o que você quis dizer.

Vou dar uma olhada nesse outro framework também, dependendo começo a estuda-lo.

Você poderia me dizer se esse exemplo que fiz é o jeito correto e menos propenso a erros?

Muito obrigado pela ajuda que vocês estão dando galera. :slight_smile:

[quote=Gleidson Henrique]sergiotaborda, entendi o que você quis dizer.

Vou dar uma olhada nesse outro framework também, dependendo começo a estuda-lo.

Você poderia me dizer se esse exemplo que fiz é o jeito correto e menos propenso a erros?

Muito obrigado pela ajuda que vocês estão dando galera. :)[/quote]

a unica coisa que tá falatando ai é IoC. Tem muitos new avulsos tipo “new XXXDAO” assim não dá. Tem que injetar os serviços no managedbean e invocar os serviços. Dao nem pensar.
(e também é melhor nem usar DAO. Use os entityManaged diretamente ).

Tirando isso acho que é a forma que o pessoal costuma usar ( eu não uso jsf) . Se está correto … bem isso é outra conversa. Depende de “correto em realação a quê”. Em relação a inversão de controle não está correto , como já expliquei.

[quote=sergiotaborda][quote=Gleidson Henrique]sergiotaborda, entendi o que você quis dizer.

Vou dar uma olhada nesse outro framework também, dependendo começo a estuda-lo.

Você poderia me dizer se esse exemplo que fiz é o jeito correto e menos propenso a erros?

Muito obrigado pela ajuda que vocês estão dando galera. :)[/quote]

a unica coisa que tá falatando ai é IoC. Tem muitos new avulsos tipo “new XXXDAO” assim não dá. Tem que injetar os serviços no managedbean e invocar os serviços. Dao nem pensar.
(e também é melhor nem usar DAO. Use os entityManaged diretamente ).

Tirando isso acho que é a forma que o pessoal costuma usar ( eu não uso jsf) . Se está correto … bem isso é outra conversa. Depende de “correto em realação a quê”. Em relação a inversão de controle não está correto , como já expliquei.[/quote]

Fui ler sobre MVP, não entendi direito o funcionamento, vou ler novamente e fazer um teste depois.

O IoC, pelo que entendi, é não ficar criando instancias uma dentro da outra, não gerando um acoplamento entre as classes. Vi isso nesse link:
http://forum.mentaframework.org/posts/list/193.page

Porém, vou ter que estudar certinho e fazer uns testes para entender corretamente o funcionamento disso… Somente com exemplos aprenderemos né… rsrs

Essa questão do DAO tem a ver com o IoC? Pois não entendi muito bem… Caso sim, estarei dando uma estudada nisso certinho, depois quando tiver outras duvidas eu volto aqui.
Até entendi que estou criando em muitos lugares o GenericDao dao = new GenericDao(); , mas, não pensei em outra forma mais fácil de fazer isso, sem gastar tanta memoria.

Pesquisando sobre Injeção de Dependência, vi um topico em que você ajudou uma outra pessoa também.

http://www.guj.com.br/java/197666-inversao-de-controle-x-injecao-de-dependencia

IoC é só isso?

[code]GenericDao dao = new GenericDao();

A a = new A(dao);[/code]

Se for, realmente é fácil, é so enviar o dao para cada construtor, porém, terei um dao que será executado enquanto o sistema estiver funcionando, correto?

Embora acho que é melhor ter um objeto de dao na memoria enquanto o programa estiver rodando do que ficar instanciando vários objetos e esperar que o GB trate de limpa-los da memória ^^

Me dê sua opinião sobre isso, por favor.

[quote=Gleidson Henrique]Pesquisando sobre Injeção de Dependência, vi um topico em que você ajudou uma outra pessoa também.

http://www.guj.com.br/java/197666-inversao-de-controle-x-injecao-de-dependencia

IoC é só isso?

[code]GenericDao dao = new GenericDao();

A a = new A(dao);[/code]

Se for, realmente é fácil, é so enviar o dao para cada construtor, porém, terei um dao que será executado enquanto o sistema estiver funcionando, correto?

Embora acho que é melhor ter um objeto de dao na memoria enquanto o programa estiver rodando do que ficar instanciando vários objetos e esperar que o GB trate de limpa-los da memória ^^

Me dê sua opinião sobre isso, por favor.
[/quote]

Então o IoC é basicamente isso. Mas quando vc aplica isso a todas as classes rápidamente via entender que fica dificil de gerenciar. Ai que entra o conceito de IoC Container que são frameworks que ajudam a criar os objetos. o Spring , o Guice e o CDI são exemplos deste tipo de framework.

O resulado de usar IoC com IoC Container é que realmente só existe uma instancia de cada objeto. Quando vc faz na mão é mais difícil garantir isso.

O problema do dao é um pouco diferente. Este não é um padrão útil nos dias de hoje. Se vc está usando Hibernate ou JPA vc deveria estar usando eles e não encapsular num DAO. Se vc quiser encapsular, o faça em outro tipo de padrão que não o DAO ( o candidato é DomainStore)
Dao é coisa do passado e arquitetar seus projetos com ele - mesmo que projetos para aprender - é andar para trás.

Entendi a questão do IoC Container, qual você acha mais apropriado para utilizar com JSF ?

A questão do DAO, esse DAO é uma classe Generica, em que eu mando salvar o objeto que eu desejo e ele sabe qual é através do @Table. Estou utilizando hibernate e configuro as tabelas na classe HibernateUtil.

Então nesse GenericDao tem alguns metodos comuns, como salvar, deletar, buscar por id, buscar todos, coisas desses tipos e caso eu precisasse implementar metodos diferentes, faria em um DAO proprio, tipo ClienteDAO, FornecedorDAO… Entende?

Esse jeito então está ultrapassado? rsrs

Abraços

[quote=Gleidson Henrique]Entendi a questão do IoC Container, qual você acha mais apropriado para utilizar com JSF ?
[/quote]

Se vc quiser seguir os padrões mais atuais, CDI, se não, Spring.

Sim.

Pegue seu GenericDao e chama de HiberanteDomainStore que implementa DomainStore (esta classe não tem generics). Faça ela final. Nada de herança. Pronto. É só isso que precisa.
Não existem “metodos diferentes”.

Na prática vc vai precisa de fazer queries e precisa especificar as queries. Para isso use o padrão Repository. Apenas para as classes que vc precisa criar queries, vc cria um repositorio. Ese cara cria um objeto com a especificação da query ( um criteria) e manda para o DomainStore que executa e lhe dá o resultado. Se precisa de lógicas especiais além da query o repositorio pode fazer essas. Mas veja, não é para todas as classes que vc cria um repositorio, apenas para as quais vc precisa fazer find. O save, update, delete vc faz diretamente no domainStore.