jueves, 17 de septiembre de 2015

Business.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Migration.Target.Dao.Entities;
using Migration.Target.Dao.Repositories;
using Migration.Target.Dao.Filters;

namespace Migration.Target.Business
{
    public abstract class Business<TEntity>
    where TEntity : Entity
    {
        private Repository<TEntity> _repository;
        protected Repository<TEntity> GetRepository()
        {
            if (this._repository == null)
                this._repository = Activator.CreateInstance<Repository<TEntity>>();
            return this._repository;
        }

        #region Miembros de IEntityService<TEntity>

        public TEntity Get(long id)
        {
            Repository<TEntity> repository = this.GetRepository();

            TEntity entity = repository.Get(id);
            if (entity == null)
                throw new Exception("No existe el registro");

            return entity;
        }

        protected virtual IQueryable<TEntity> FilteringRules(IQueryable<TEntity> queryBase)
        {
            return queryBase;
        }

        public IList<TEntity> List()
        {
            Repository<TEntity> repository = this.GetRepository();

            IQueryable<TEntity> queryBase = repository.GetQuery();
            queryBase = this.FilteringRules(queryBase);

            return queryBase.ToList();
        }

        public IList<TEntity> Find(Filter<TEntity> filter)
        {
            if (filter == null)
                throw new ArgumentNullException("filter");

            Repository<TEntity> repository = this.GetRepository();

            IQueryable<TEntity> queryBase = repository.GetQuery();

            //Prepara query con el filtro
            queryBase = filter.BuildFilter(queryBase);
            //Incluye reglas de filtrado
            queryBase = this.FilteringRules(queryBase);
            //Prepara ordenamiendo
            queryBase = filter.Sort.BuildSortBy(queryBase);
            //Prepara paginado
            queryBase = filter.Pager.BuildPager(queryBase);

            return queryBase.ToList();
        }

        public TEntity First(Filter<TEntity> filter)
        {
            if (filter == null)
                throw new ArgumentNullException("filter");

            Repository<TEntity> repository = this.GetRepository();

            IQueryable<TEntity> queryBase = repository.GetQuery();

            //Prepara query con el filtro
            queryBase = filter.BuildFilter(queryBase);
            //Incluye reglas de filtrado
            queryBase = this.FilteringRules(queryBase);
            //Prepara ordenamiendo
            queryBase = filter.Sort.BuildSortBy(queryBase);

            // TODO: Revisar
            return queryBase.FirstOrDefault();
        }

        public TEntity Single(Filter<TEntity> filter)
        {
            if (filter == null)
                throw new ArgumentNullException("filter");

            Repository<TEntity> repository = this.GetRepository();

            IQueryable<TEntity> queryBase = repository.GetQuery();

            //Prepara query con el filtro
            queryBase = filter.BuildFilter(queryBase);
            //Incluye reglas de filtrado
            queryBase = this.FilteringRules(queryBase);

            // TODO: Revisar
            return queryBase.SingleOrDefault();
        }

        public int Count(Filter<TEntity> filter)
        {
            if (filter == null)
                throw new ArgumentNullException("filter");

            Repository<TEntity> repository = this.GetRepository();

            IQueryable<TEntity> queryBase = repository.GetQuery();

            //Prepara query con el filtro
            queryBase = filter.BuildFilter(queryBase);
            //Incluye reglas de filtrado
            queryBase = this.FilteringRules(queryBase);

            // TODO: Revisar
            return queryBase.Count();
        }

        public virtual TEntity Create(TEntity entity)
        {
            Repository<TEntity> repository = this.GetRepository();
            TEntity entityReal = repository.Create(entity);
            return entity;
        }

        public virtual TEntity Update(TEntity entity)
        {
            Repository<TEntity> repository = this.GetRepository();
            TEntity entityReal = repository.Update(entity);
            return entity;
        }

        public virtual TEntity Delete(TEntity entity)
        {
            Repository<TEntity> repository = this.GetRepository();
            TEntity entityReal = repository.Delete(entity);
            return entity;
        }

        #endregion
    }
}

No hay comentarios:

Publicar un comentario