Aplicação MVC com Class Library Vamos considerar uma Class Library com o modelo de dados e com acesso à base de dados através do Entity Framework. Uma Class Library nunca funciona sozinha. Vamos usá-la a partir de uma Aplicação Web MVC 5. O que executámos é a aplicação web, e é o ficheiro de configuração desta aplicação que é usado. A connection string deve estar no ficheiro web.config do projecto da aplicação web. A Class Library (que referenciamos do projecto aplicação web) deve ler a connection string do ficheiro web.config da aplicação web. Em geral, uma class library pode ser usada por diferentes programas, cada um usando diferentes configurações. Isto implica que a configuração deve residir na aplicação executável, e não na class library. Vamos criar os seguintes programas: 1) Uma solução para conter vários projectos. 2) Uma Class Library com o modelo de dados e acesso à base de dados através do Entity Framework. 3) Uma Aplicação Web, MVC5, com uma Referência para a Class Library. Em 2) não há necessidade de connection string. Em 3) a connection string deve estar no ficheiro Web.config da Aplicação Web. 1. Criar a Solução Visual Studio 2015 > File > New Project > Templates: abrir Other Project Types > Visual Studio Solutions > Blank Solution Name: Empregados 2. Criar a Class Library Class Library ligada à base de dados através do Entity Framework Bt. dir. do rato em cima do nome da solução: Add > New Project > Visual C# > Class Library Name: DataAccessLibrary OK 2.1 Adicionar Entity Framework à Class Library Bt. dir. do rato em cima do nome da Class Library: DataAccessLibrary > Manage Nuget Packages > (Online) > Entity Framework > Install Downloading Entity Framework Accept
Adicionado Entity Framework à Class Library Close Aparece o ficheiro de configuração App.config e também packages.config. 2.2 Criar uma pasta Models para as classes do modelo DataAccessLibrary > botão direito do rato: Add > New Folder > Models Models > botão direito do rato: Add > Class > Name: Empregado.cs Add public class Empregado public int EmpregadoId get; set; public string Nome get; set; public string Departamento get; set; 2.3 Criar uma pasta DAL para as classes de acesso à base de dados DataAccessLibrary > botão direito do rato: Add > New Folder > DAL DAL > botão direito do rato: Add > Class > Name: EmpregadosDbContext.cs Add public class EmpregadosDbContext : DbContext public EmpregadosDbContext() : base("defaultconnection") public DbSet<Empregado> Empregados get; set; DAL > botão direito do rato: Add > interface > Name: IEmpregadoRepository.cs Add public interface IEmpregadoRepository List<Empregado> GetData(); Empregado GetData(int id); Empregado GetData(string departamento); Empregado Create(Empregado emp); bool Update(int id, Empregado emp); bool Delete(int id); DAL > botão direito do rato: Add > class > Name: EmpregadoRepository.cs Add public class EmpregadoRepository : IEmpregadoRepository public EmpregadosDbContext context; public EmpregadoRepository() context = new EmpregadosDbContext(); public Empregado Create(Empregado emp) context.empregados.add(emp); context.savechanges(); return emp;
public bool Delete(int id) var emp = context.empregados.find(id); if (emp!= null) context.empregados.remove(emp); context.savechanges(); return true; else return false; public List<Empregado> GetData() var empregados = context.empregados.tolist(); return empregados; public Empregado GetData(int id) return context.empregados.find(id); public List<Empregado> GetData(string departamento) var empregados = context.empregados.where(e => e.departamento == departamento); return empregados.tolist(); public bool Update(int id, Empregado emp) var empregado = context.empregados.find(id); if (emp!= null) empregado.nome = emp.nome; empregado.departamento = emp.departamento; context.savechanges(); return true; else return false; 2.4 Compilar para criar a dll Bt. dir. do rato em cima do nome da class library: DataAccessLibrary > Build Cria a dll Empregados/DataAccessLibrary/bin/DataAccessLibrary.dll 3. Criar uma Aplicação Web MVC5 Esta aplicação Web usa uma referência para a Class Library. Bt. dir. do rato em cima do nome da solução:
Add > New Project > Visual C# Web > Asp.Net Web Application Name: WebApplication1 OK Template: MVC OK 3.1 Adicionar referência para a Class Library Bt. dir. do rato em cima do nome do projeto da aplicação web: WebApplication1 > Add > Reference > Solution > DataAccessLibrary Marcar DataAccessLibrary OK Em Solution Explorer abrir o item References e verificar que existe DataAccessLibrary. 3.2 Build da Aplicação Bt. dir. do rato em cima do nome do projeto da aplicação web: Build Necessário para em seguida o scaffolding poder usar as classes do modelo e do contexto de dados definidas na Class Library. 3.3 Scaffolding para criar Controladores e Vistas Controllers > botão direito do rato: Add > Controller > Add Scaffold: MVC 5 Controller with views, using Entity Framework > Add Model class: Data context class: Controller name: Empregado (DataAccessLibrary.Models) EmpregadosDbContext (DataAccessLibrary.DAL) EmpregadosController Add 3.4 Executar a aplicação WebApplication1 > Set as StartUp Project Debug > Start Debugging Na barra de endereços do browser acrescentar /Empregados localhost:xxxx/empregados 3.5 Alterar o código da classe EmpregadosController para usar o Repositório public class EmpregadosController : Controller // private EmpregadosDbContext db = new EmpregadosDbContext(); private IEmpregadoRepository repo = new EmpregadoRepository(); // GET: Empregados public ActionResult Index() // return View(db.Empregados.ToList()); return View(repo.GetData());
// GET: Empregados/Details/5 public ActionResult Details(int? id) if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); // Empregado empregado = db.empregados.find(id); Empregado empregado = repo.getdata((int)id); if (empregado == null) return HttpNotFound(); // GET: Empregados/Create public ActionResult Create() return View(); // POST: Empregados/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create( [Bind(Include = "EmpregadoId,Nome,Departamento")] Empregado empregado) if (ModelState.IsValid) //db.empregados.add(empregado); //db.savechanges(); repo.create(empregado); return RedirectToAction("Index"); // GET: Empregados/Edit/5 public ActionResult Edit(int? id) if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); // Empregado empregado = db.empregados.find(id); Empregado empregado = repo.getdata((int)id); if (empregado == null) return HttpNotFound(); // POST: Empregados/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit( [Bind(Include = "EmpregadoId,Nome,Departamento")] Empregado empregado) if (ModelState.IsValid)
//db.entry(empregado).state = EntityState.Modified; //db.savechanges(); repo.update(empregado.empregadoid, empregado); return RedirectToAction("Index"); // GET: Empregados/Delete/5 public ActionResult Delete(int? id) if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); // Empregado empregado = db.empregados.find(id); Empregado empregado = repo.getdata((int)id); if (empregado == null) return HttpNotFound(); // POST: Empregados/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public ActionResult DeleteConfirmed(int id) //Empregado empregado = db.empregados.find(id); //db.empregados.remove(empregado); //db.savechanges(); repo.delete(id); return RedirectToAction("Index"); //protected override void Dispose(bool disposing) // // if (disposing) // // db.dispose(); // // base.dispose(disposing); //