Search code examples
c#repositoryextension-methodsasp.net-boilerplateirepository

ASP.NET Boilerplate IRepository extension method


For Organization Units, we used the code below to get entities in an Organization Unit including its child Organization Units. Is it reasonable and how to extend the IRepository to add this feature to all entities?

public virtual List<Product> GetProductsInOuIncludingChildren(long organizationUnitId)
{
    var code = _organizationUnitRepository.Get(organizationUnitId).Code;

    var query =
        from product in _productRepository.GetAll()
        join organizationUnit in _organizationUnitRepository.GetAll() on product.OrganizationUnitId equals organizationUnit.Id
        where organizationUnit.Code.StartsWith(code)
        select product;

    return query.ToList();
}

Solution

  • First, inherit IMustHaveOrganizationUnit:

    public class Product : Entity, IMustHaveOrganizationUnit
    {
        public long OrganizationUnitId { get; set; }
    }
    

    Then define the extension method:

    public static class RepositoryExtensions
    {
        public static List<TEntity> GetAllInOuIncludingChildren<TEntity, TPrimaryKey>(
            this IRepository<TEntity, TPrimaryKey> repository,
            long organizationUnitId
        )
            where TEntity : class, IEntity<TPrimaryKey>, IMustHaveOrganizationUnit
        {
            using (var organizationUnitRepository = repository.GetIocResolver().ResolveAsDisposable<IRepository<OrganizationUnit, long>>())
            {
                var code = organizationUnitRepository.Object.Get(organizationUnitId).Code;
    
                var query =
                    from entity in repository.GetAll()
                    join organizationUnit in organizationUnitRepository.Object.GetAll() on entity.OrganizationUnitId equals organizationUnit.Id
                    where organizationUnit.Code.StartsWith(code)
                    select entity;
    
                return query.ToList();
            }
        }
    }
    

    Usage:

    var products = _productRepository.GetAllInOuIncludingChildren(organizationUnitId);