Usuário com melhor resposta
Controller e Business Genéricos para frontend com ExtJS

Pergunta
-
Olá, antes de tudo, gostaria de dizer que já conheço o Ext.NET e outras soluções, mas não busco nenhuma biblioteca, e sim entender e implementar a solução para o meu problema sem o uso de libs adicionais.Trabalho em uma aplicação com frontend em ExtJS, ASP.NET MVC 3 e Entity Framework 4, e buscando reuso e facilidade na implementação, estou tentando abstrair os controllers e business.Quanto ao controller já tive um progresso considerável, já em relação ao business estou um tanto empacado para conseguir deixar o acesso aos DbSets e entidades. Não tenho muita experiência em linguagens fortemente tipada, e menos ainda com C# portanto agradeço pela compreensão quanto ao nível da dúvida.Bem, abaixo segue o meu GenericBusiness atual, o intuito é deixá-lo transparente o suficiente para trabalhar com qualquer entidade nos métodos contidos nele.Alterei alguns nomes e namespaces para manter o sigilo dos fontes do cliente.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySystem.Data; using System.Collections; using System.Data; using System.Data.Entity; namespace MySystem.Business { public class GenericBusiness<TEntity> { protected MySystemEntities dbContext { get; set; } /// <summary> /// /// </summary> /// <param name="dbContext"></param> public GenericBusiness(MySystemEntities dbContext) { this.dbContext = dbContext; } /// <summary> /// /// </summary> /// <param name="queryParams"></param> /// <returns></returns> public IQueryable<TEntity> GetQuery(Hashtable queryParams) { return from t in dbContext.MEU_DB_SET select t; } /// <summary> /// /// </summary> /// <param name="queryParams"></param> /// <returns></returns> public List<TEntity> GetData(Hashtable queryParams) { int start = (int)queryParams["start"]; int limit = (int)queryParams["limit"]; var q = this.GetQuery(queryParams); return q.OrderBy(t => t.CAMPO).Skip(start).Take(limit).ToList(); } public int GetDataCount(Hashtable queryParams) { return this.GetQuery(queryParams).Count(); } /// <summary> /// /// </summary> /// <param name="queryParams"></param> /// <returns></returns> public TEntity Save(Hashtable queryParams) { var id = Int32.Parse((string)queryParams["id"]); var regional = (string)queryParams["regional"]; var descricao = (string)queryParams["descricao"]; // TEntity deverá ser uma das entidade que quero salvar no banco var row = new TEntity { Id = id, Regional = regional, Descricao = descricao }; if (row.Id != null && row.Id != 0) { dbContext.Entry(row).State = EntityState.Modified; } else { dbContext.Entry(row).State = EntityState.Added; } dbContext.SaveChanges(); return row; } public bool Delete(int id) { var row = dbContext.MEU_DB_SET.Find(id); if (row != null) { try { dbContext.Entry(row).State = EntityState.Deleted; dbContext.SaveChanges(); return true; } catch (Exception ex) { throw ex; } } else { return false; } } } }
e um exemplo de classe filha seria:using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySystem.Data; using System.Collections; using System.Data.Entity; using System.Data; namespace MySystem.Business { public class RegionalBusiness : GenericBusiness<Regional> { } }
onde nos controllers eu usaria algo como:using System.Web.Mvc; using System.Collections; using System; using MySystem.Business; using MySystem.Data; namespace MySystemWeb.Controllers { [Authorize] public class RegionalController : GenericController<GenericBusiness<Regional>, Regional> { protected Hashtable GetRequestData() { string id = Request.Params["Id"]; string regional = Request.Params["Regional"]; string descricao = Request.Params["Descricao"]; if (id.Trim().Equals("")) { id = "0"; } Hashtable queryParams = new Hashtable(); queryParams.Add("id", id); queryParams.Add("regional", regional); queryParams.Add("descricao", descricao); return queryParams; } } }
Sei quem tem muita coisa pra melhorar, mas é exatamente este meu esforço no momento.Agradeço antecipadamente pela ajuda/discussão.
Respostas
-
Olá Arian,
Bom, na verdade o que você chama de "business", é muito conhecido com "DAO" ou "Repositorio", esse dois caras são padrões de acesso a dados muito difundido na comunidade Java e .Net, acredito que se você fazer uma pequena pesquisa, encontrará coisas interessante a respeito desse assunto.
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
http://martinfowler.com/eaaCatalog/repository.html
- Sugerido como Resposta Rafael Zaccanini segunda-feira, 9 de janeiro de 2012 00:03
- Marcado como Resposta welington jrModerator domingo, 18 de março de 2018 18:24