none
Controller e Business Genéricos para frontend com ExtJS RRS feed

  • 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.
    terça-feira, 27 de dezembro de 2011 19:17

Respostas