3. Criar um projeto MVC, sem IDENTITY com as pastas MVC, dentro da pasta
Presentation.
4. Apagar o "readme".
6. Criar, dentro da camada de Infra, dentro da pasta DATA, um projeto do tipo “Class
Library”.
Apague todas as referências do projeto
Apague a classe criada automaticamente.
10. Criar as Classes para cada entidade do projeto na pasta ENTITIES do projeto DOMAIN.
12. Criar uma Classe de contexto, dentro da pasta CONTEXT do projeto INFRA.DATA.
Fazer a Classe de contexto herdar da Classe DbContext. (System.Data.Entity)
Adicionar, ao projeto MVC no arquivo Web.Config, a connectionstring para a
conexão com o servidor SQL e o BD.
Criar um método construtor que recebe ":base("[Nome da String de
Conexão]").
Criar os DbSet<> para cada entidade do domínio.
Sugestão:
i. Caso você utilize alguma outra convenção fazer as mudanças nessa
classe. Ex.:
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries().Where(entry =>
entry.Entity.GetType().GetProperty("DataCadastro") != null))
{
if (entry.State == EntityState.Added)
{
entry.Property("DataCadastro").CurrentValue = DateTime.Now;
}
if (entry.State == EntityState.Modified)
{
entry.Property("DataCadastro").IsModified = false;
}
}
return base.SaveChanges();
}
15. Criar, na pasta ENTITYCONFIG dentro do projeto INFRA.DATA, uma classe chamada
[Nome da entidade]Configuration, herdando de EntityTypeConfiguration<[Entidade]>,
para CADA ENTIDADE.
Adicionar configurações para que o EntityFramework saiba como criar as
tabelas no banco da maneira desejada.
Ex.:
public ProdutoConfiguration()
{
HasKey(p => p.ProdutoID); //Para definir a chave primária.
Com esses passos o MVC já pode funcionar, mas ainda com muitos acoplamentos. O MVC não
deve saber o que acontece dentro do projeto DATA. O ideal é que o MVC converse com o
contexto através de interfaces.
20. Criar a classe de repositório de cada Entidade, dentro da pasta Repositories dentro do
projeto INFRA.DATA, herdando o repositório base (passando a Entidade como
referência) e implementando a Interface do repositório da Entidade.
Ex.:
public class ClienteRepository : BaseRepository<Cliente>, IClienteRepository
{
}
public class ProdutoRepository : BaseRepository<Produto>, IProdutoRepository
{
public IEnumerable<Produto> BuscarPorNome(string nome)
{
return Db.Produtos.Where(p => p.Nome == nome);
}
}
21. Se quiser, testar no projeto MVC. Modificar nome da pasta MODELS para ViewModels
22. Criar as ViewModels para cada Entidade (só os atributos, sem comportamentos
(métodos)).
30. No projeto de DOMINIO, dentro da pasta Interfaces, criar uma nova pasta chamada
Repositories e mover todas interfaces de repositório para a mesma.
31. No projeto de DOMINIO, dentro da pasta Interfaces, criar uma nova pasta chamada
Services
34. Criar, dentro do projeto de DOMINIO, dentro da pasta Services, a classe BaseService.
Serviços são utilizados para fazer a ponte entre o domínio e o repositório.
Ex.:
public class BaseService<TEntity> : IDisposable, IBaseService<TEntity> where
TEntity : class
{
//Fazer a chamado para o repositório
private readonly IBaseRepository<TEntity> _repository;
//Construtor Base
public BaseService(IBaseRepository<TEntity> repository)
{
_repository = repository;
}
35. Criar os serviços especialistas, para cada Entidade, na pasta Services do projeto
DOMAIN.
Ex.:
public class ClienteService : BaseService<Cliente>, IClienteService
{
private readonly IClienteRepository _clienteRepository;
37. Criar as interfaces especializadas para cada entidade. (Não esquecer de adicionar
referências das entidades de domínio nesse projeto)
Ex.:
public interface IClienteAppService : IAppBaseService<Cliente>
{
IEnumerable<Cliente> ObterClientesEspeciais(IEnumerable<Cliente> clientes);
}
public interface IProdutoAppService : IAppBaseService<Produto>
{
IEnumerable<Produto> BuscarPorNome(string nome); //Tem que refletir dentro da
interface os métodos definidos no repositório.
}
// GET: Clientes
public ActionResult Index()
{
var clienteViewModel = Mapper.Map<IEnumerable<Cliente>,
IEnumerable<ClienteViewModel>>(_clienteApp.GetAll());
return View(clienteViewModel);
}
// GET: Clientes/Details/5
public ActionResult Details(int id)
{
var cliente = _clienteApp.GetById(id);
var clienteViewModel = Mapper.Map<Cliente, ClienteViewModel>(cliente);
return View(clienteViewModel);
}
Caso a entidade faça referência a outra entidade faça a injeção de
dependência.
i. Ex.:
_produtoApp = produtoApp;
_clienteApp = clienteApp;
* Criar as ViewBags com a SelectList para os dropdowns das views que precisarem.
kernel.Bind(typeof(IBaseService<>)).To(typeof(BaseService<>));
kernel.Bind<IClienteService>().To<ClienteService>();
kernel.Bind<IProdutoService>().To<ProdutoService>();
//(Por causa destas referências será necessário adicionar a referência para a ca-
mada de Dados.)
//(O certo seria criar um Modulo em uma camada separada para reduzir
dependências)
kernel.Bind(typeof(IBaseRepository<>)).To(typeof(BaseRepository<>));
kernel.Bind<IClienteRepository>().To<ClienteRepository>();
kernel.Bind<IProdutoRepository>().To<ProdutoRepository>();
42. Criar e ajustar as views para cada ação de cada controller. (Pode usar o scaffolding
para adiantar o processo)
Trocar o @Html.EditFor... dos campos que forem virar dropdown lists para
@Html.DropDownList recebendo a viewbag e mais um campo em branco.
Ex.:
43. FIM! :D